From 6754ace4251fa7f4460ff7e4d0cb94aec20fa18d Mon Sep 17 00:00:00 2001 From: youda Date: Tue, 13 May 2025 00:05:39 +0800 Subject: [PATCH] 111 --- app/admin/controller/Diamond.php | 189 +++++++++++++ app/admin/route/app.php | 8 + app/admin/view/Diamond/index.html | 394 +++++++++++++++++++++++++++ app/common/model/DiamondProducts.php | 79 ++++++ config/menu.php | 5 + public/js/reward-component.js | 389 +++++++++++++++----------- 6 files changed, 907 insertions(+), 157 deletions(-) create mode 100644 app/admin/controller/Diamond.php create mode 100644 app/admin/view/Diamond/index.html create mode 100644 app/common/model/DiamondProducts.php diff --git a/app/admin/controller/Diamond.php b/app/admin/controller/Diamond.php new file mode 100644 index 0000000..07d6bd2 --- /dev/null +++ b/app/admin/controller/Diamond.php @@ -0,0 +1,189 @@ +isAjax()) { + $param = input('param.'); + $limit = $param['limit'] ?? 15; + $page = $param['page'] ?? 1; + $name = $param['name'] ?? ''; + $status = $param['status'] ?? ''; + + $where = []; + if ($name) { + $where[] = ['name', 'like', "%{$name}%"]; + } + if ($status !== '') { + $where[] = ['status', '=', $status]; + } + + $data = DiamondProducts::getList($where, $page, $limit); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $data['count'], + 'data' => $data['list'] + ]); + } + // View::fetch("Goods/goods"); + return View::fetch('Diamond/index'); + } + + /** + * 添加钻石商品 + */ + public function add() + { + if (request()->isPost()) { + $param = input('post.'); + + // 验证数据 + $validate = [ + 'name' => 'require', + 'products_id' => 'require', + 'products_type' => 'require', + 'base_reward' => 'require', + 'price' => 'require|float', + 'is_first' => 'require|in:0,1', + 'sort_order' => 'require|number', + 'status' => 'require|in:0,1' + ]; + $message = [ + 'name.require' => '商品名称不能为空', + 'products_id.require' => '商品ID不能为空', + 'products_type.require' => '商品类型不能为空', + 'base_reward.require' => '基础钻石数量不能为空', + 'price.require' => '价格不能为空', + 'price.float' => '价格必须为数字', + 'is_first.require' => '请选择是否为首充', + 'is_first.in' => '是否为首充值无效', + 'sort_order.require' => '排序值不能为空', + 'sort_order.number' => '排序值必须为数字', + 'status.require' => '请选择状态', + 'status.in' => '状态值无效' + ]; + + $result = $this->validate($param, $validate, $message); + if ($result !== true) { + return $this->err($result); + } + + // 处理图片路径 + $fields = ['first_charge_image', 'first_select_charge_image', 'normal_image', 'normal_select_image']; + foreach ($fields as $field) { + if (isset($param[$field]) && $param[$field]) { + $param[$field] = str_replace('/www/wwwroot/test.zfunbox.cn/public', '', $param[$field]); + } + } + + // 保存数据 + $id = DiamondProducts::add($param); + if ($id) { + return $this->succ('添加成功'); + } else { + return $this->err('添加失败'); + } + } + + return View::fetch('Diamond/add'); + } + + /** + * 编辑钻石商品 + */ + public function edit() + { + $id = input('id/d', 0); + if (!$id) { + return $this->err('参数错误'); + } + + $info = DiamondProducts::getInfo($id); + if (!$info) { + return $this->err('数据不存在'); + } + + if (request()->isPost()) { + $param = input('post.'); + + // 验证数据 + $validate = [ + 'name' => 'require', + 'products_id' => 'require', + 'products_type' => 'require', + 'base_reward' => 'require', + 'price' => 'require|float', + 'is_first' => 'require|in:0,1', + 'sort_order' => 'require|number', + 'status' => 'require|in:0,1' + ]; + $message = [ + 'name.require' => '商品名称不能为空', + 'products_id.require' => '商品ID不能为空', + 'products_type.require' => '商品类型不能为空', + 'base_reward.require' => '基础钻石数量不能为空', + 'price.require' => '价格不能为空', + 'price.float' => '价格必须为数字', + 'is_first.require' => '请选择是否为首充', + 'is_first.in' => '是否为首充值无效', + 'sort_order.require' => '排序值不能为空', + 'sort_order.number' => '排序值必须为数字', + 'status.require' => '请选择状态', + 'status.in' => '状态值无效' + ]; + + $result = $this->validate($param, $validate, $message); + if ($result !== true) { + return $this->err($result); + } + + // 处理图片路径 + $fields = ['first_charge_image', 'first_select_charge_image', 'normal_image', 'normal_select_image']; + foreach ($fields as $field) { + if (isset($param[$field]) && $param[$field]) { + $param[$field] = str_replace('/www/wwwroot/test.zfunbox.cn/public', '', $param[$field]); + } + } + + // 更新数据 + $result = DiamondProducts::edit($id, $param); + if ($result) { + return $this->succ('修改成功'); + } else { + return $this->err('修改失败'); + } + } + + View::assign('info', $info); + return View::fetch('Diamond/edit'); + } + + /** + * 删除钻石商品 + */ + public function del() + { + $id = input('id/d', 0); + if (!$id) { + return $this->err('参数错误'); + } + + $result = DiamondProducts::del($id); + if ($result) { + return $this->succ('删除成功'); + } else { + return $this->err('删除失败'); + } + } +} \ No newline at end of file diff --git a/app/admin/route/app.php b/app/admin/route/app.php index 38d4728..eea860f 100755 --- a/app/admin/route/app.php +++ b/app/admin/route/app.php @@ -465,4 +465,12 @@ Route::get('dynamicJs.js', 'Config/dynamicJs')->ext('js'); #============================ Route::rule('markdown/index', 'Markdown/index', 'GET|POST'); Route::rule('markdown/order_info', 'Markdown/order_info', 'GET|POST'); + +#============================ +#Diamond.php钻石商品配置 +#============================ +Route::rule('diamond', 'Diamond/index', 'GET|POST'); +Route::rule('diamond_add', 'Diamond/add', 'GET|POST'); +Route::rule('diamond_edit', 'Diamond/edit', 'GET|POST'); +Route::rule('diamond_del', 'Diamond/del', 'GET|POST'); \ No newline at end of file diff --git a/app/admin/view/Diamond/index.html b/app/admin/view/Diamond/index.html new file mode 100644 index 0000000..97d8b95 --- /dev/null +++ b/app/admin/view/Diamond/index.html @@ -0,0 +1,394 @@ +{include file="Public:header3"/} + + +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + {include file="Public:footer3"/} + + + + \ No newline at end of file diff --git a/app/common/model/DiamondProducts.php b/app/common/model/DiamondProducts.php new file mode 100644 index 0000000..0fe8970 --- /dev/null +++ b/app/common/model/DiamondProducts.php @@ -0,0 +1,79 @@ +count(); + $list = $query->order('sort_order asc') + ->page($page, $limit) + ->select() + ->toArray(); + + return ['list' => $list, 'count' => $count]; + } + + /** + * 添加钻石商品 + * @param array $data 商品数据 + * @return int|string + */ + public static function add($data) + { + $model = new self; + $model->save($data); + return $model->id; + } + + /** + * 修改钻石商品 + * @param int $id 商品ID + * @param array $data 商品数据 + * @return bool + */ + public static function edit($id, $data) + { + return self::where('id', $id)->update($data); + } + + /** + * 删除钻石商品 + * @param int $id 商品ID + * @return bool + */ + public static function del($id) + { + return self::where('id', $id)->delete(); + } + + /** + * 获取钻石商品详情 + * @param int $id 商品ID + * @return array|Model|null + */ + public static function getInfo($id) + { + return self::where('id', $id)->find(); + } +} \ No newline at end of file diff --git a/config/menu.php b/config/menu.php index 680d6ef..ad7cabd 100755 --- a/config/menu.php +++ b/config/menu.php @@ -86,6 +86,11 @@ return [ 'url' => '/admin/card_shang', 'name' => '抽奖等级设置', ], + [ + 'url' => '/admin/diamond', + 'name' => '钻石商品配置', + ], + ], ], [ diff --git a/public/js/reward-component.js b/public/js/reward-component.js index 89ceac1..565758d 100755 --- a/public/js/reward-component.js +++ b/public/js/reward-component.js @@ -3,15 +3,23 @@ * 用于创建和管理奖励信息表单元素 */ +// 存储所有实例的映射 +var rewardInstances = {}; + /** * 初始化奖励信息区域 * @param {string} containerId - 容器ID * @param {Array|string} existingRewards - 已存在的奖励数据数组或reward_id + * @param {string} fieldName - 自定义字段名,默认为reward_id + * @returns {string} - 返回实例ID,用于后续操作 */ -function initRewardInfo(containerId, existingRewards = null) { +function initRewardInfo(containerId, existingRewards = null, fieldName = 'reward_id') { var $ = layui.$; var form = layui.form; + // 创建实例ID + var instanceId = containerId + '_' + new Date().getTime(); + // 奖励类型选项 var rewardTypes = [ { value: '1', text: '钻石' }, @@ -23,21 +31,24 @@ function initRewardInfo(containerId, existingRewards = null) { // 存储优惠券数据 var couponsData = []; - // 创建奖励信息卡片 + // 创建奖励信息卡片 - 使用实例化ID var cardHtml = '
' + '
' + - '' + '
' + '
' + - '
' + + '
' + '' + '
' + '
' + '
'; - if ($('input[name="reward_id"]').length == 0) { - cardHtml += ''; + + // 只有在不存在同名字段时添加隐藏字段 + if ($('#' + containerId + ' input[name="' + fieldName + '"]').length == 0 && + $('input[name="' + fieldName + '"]').length == 0) { + cardHtml += ''; } // 渲染奖励信息卡片 @@ -70,15 +81,15 @@ function initRewardInfo(containerId, existingRewards = null) { // 生成唯一ID function generateUniqueId() { - return 'reward_' + new Date().getTime() + '_' + Math.floor(Math.random() * 1000); + return instanceId + '_item_' + new Date().getTime() + '_' + Math.floor(Math.random() * 1000); } // 添加奖励项 function addRewardItem(rewardData = null) { var uniqueId = generateUniqueId(); - var html = '
' + + var html = '
' + '
' + - '' + ''; // 添加奖励类型选项 @@ -95,27 +106,27 @@ function initRewardInfo(containerId, existingRewards = null) { var couponDisplay = (!rewardData || rewardData.reward_type != '4') ? 'style="display:none;"' : ''; var rewardValue = rewardData ? rewardData.reward_value : ''; - html += '
' + - '' + + html += '
' + + '' + '
' + - '
' + - '' + '' + '' + '' + '
' + '
' + - '' + '
' + '
'; - $('#rewardContainer').append(html); + $('#' + instanceId + '_rewardContainer').append(html); form.render('select'); // 重新渲染表单 // 绑定删除按钮事件 - $('.remove-reward[data-id="' + uniqueId + '"]').click(function () { + $('.' + instanceId + '-remove-reward[data-id="' + uniqueId + '"]').click(function () { var id = $(this).data('id'); $('#' + id).remove(); }); @@ -123,7 +134,7 @@ function initRewardInfo(containerId, existingRewards = null) { // 如果是优惠券类型,需要加载优惠券数据 if (rewardData && rewardData.reward_type == '4') { var $item = $('#' + uniqueId); - var $couponSelect = $item.find('.coupon-select'); + var $couponSelect = $item.find('.' + instanceId + '-coupon-select'); // 获取优惠券数据并选中指定的优惠券 if (couponsData.length > 0) { @@ -139,22 +150,22 @@ function initRewardInfo(containerId, existingRewards = null) { } // 添加奖励按钮点击事件 - $('#addReward').click(function () { + $('#' + instanceId + '_addReward').click(function () { addRewardItem(); }); // 监听奖励类型选择 - form.on('select(rewardTypeFilter)', function (data) { - var $item = $(data.elem).closest('.reward-item'); + form.on('select(' + instanceId + 'RewardTypeFilter)', function (data) { + var $item = $(data.elem).closest('.' + instanceId + '-reward-item'); var value = data.value; if (value == '4') { // 选择了优惠券 - $item.find('.reward-value-container').hide(); - $item.find('.coupon-container').show(); - $item.find('.reward-value-input').val(''); // 清空奖励数值 + $item.find('.' + instanceId + '-reward-value-container').hide(); + $item.find('.' + instanceId + '-coupon-container').show(); + $item.find('.' + instanceId + '-reward-value-input').val(''); // 清空奖励数值 // 获取当前选择框的优惠券选择框 - var $couponSelect = $item.find('.coupon-select'); + var $couponSelect = $item.find('.' + instanceId + '-coupon-select'); // 如果优惠券数据已加载,直接填充 if (couponsData.length > 0) { @@ -166,9 +177,9 @@ function initRewardInfo(containerId, existingRewards = null) { }); } } else { - $item.find('.reward-value-container').show(); - $item.find('.coupon-container').hide(); - $item.find('.coupon-select').val(''); // 清空优惠券选择 + $item.find('.' + instanceId + '-reward-value-container').show(); + $item.find('.' + instanceId + '-coupon-container').hide(); + $item.find('.' + instanceId + '-coupon-select').val(''); // 清空优惠券选择 form.render('select'); } }); @@ -207,8 +218,8 @@ function initRewardInfo(containerId, existingRewards = null) { layer.close(loadingIndex); if (res.status === 1 && res.data && res.data.length > 0) { // 先获取优惠券数据,再初始化奖励表单 - if ($('input[name="reward_id"]').length > 0) { - $('input[name="reward_id"]').val(rewardId); + if ($('input[name="' + fieldName + '"]').length > 0) { + $('input[name="' + fieldName + '"]').val(rewardId); } fetchCoupons(function () { // 遍历奖励数据,添加奖励项 @@ -244,151 +255,215 @@ function initRewardInfo(containerId, existingRewards = null) { // 预加载优惠券数据,以便后续使用 fetchCoupons(); } + + // 存储实例相关数据 + rewardInstances[instanceId] = { + containerId: containerId, + fieldName: fieldName, + validateRewardInfo: function () { + var hasRewardType = false; + $('.' + instanceId + '-reward-type-select').each(function () { + if ($(this).val()) { + hasRewardType = true; + var $item = $(this).closest('.' + instanceId + '-reward-item'); + var rewardType = $(this).val(); + + // 如果不是优惠券类型,检查奖励数值 + if (rewardType != '4' && !$item.find('.' + instanceId + '-reward-value-input').val()) { + layer.msg('请输入奖励数值', { icon: 2, anim: 6, time: 1500 }); + hasRewardType = false; + return false; + } + + // 如果是优惠券类型,检查是否选择了优惠券 + if (rewardType == '4' && !$item.find('.' + instanceId + '-coupon-select').val()) { + layer.msg('请选择优惠券', { icon: 2, anim: 6, time: 1500 }); + hasRewardType = false; + return false; + } + } + }); + + if (!hasRewardType) { + layer.msg('请至少添加一项奖励信息', { icon: 2, anim: 6, time: 1500 }); + return false; + } + + // 验证通过后,处理奖励数据 + this.processRewardData(); + return true; + }, + processRewardData: function () { + var rewardData = []; + + // 收集所有奖励项的数据 + $('.' + instanceId + '-reward-item').each(function () { + var $item = $(this); + var rewardType = $item.find('.' + instanceId + '-reward-type-select').val(); + + if (rewardType) { + var rewardObj = { + reward_type: rewardType, + reward_value: '', + coupon_id: '' + }; + + // 根据奖励类型设置相应的值 + if (rewardType == '4') { // 优惠券类型 + rewardObj.coupon_id = $item.find('.' + instanceId + '-coupon-select').val() || ''; + } else { // 其他类型 + rewardObj.reward_value = $item.find('.' + instanceId + '-reward-value-input').val() || ''; + } + + rewardData.push(rewardObj); + } + }); + + // 将奖励数据转换为JSON字符串 + var rewardJson = JSON.stringify(rewardData); + + // 创建或更新reward字段名 + var rewardDataFieldName = 'reward_' + fieldName.replace('_id', ''); + if ($('input[name="' + rewardDataFieldName + '"]').length > 0) { + $('input[name="' + rewardDataFieldName + '"]').val(rewardJson); + } else { + $('form').append(''); + } + }, + processRewardIdData: async function (pre, reward_id = '') { + var rewardData = []; + var $ = layui.$; // 确保在异步函数内部重新获取jQuery引用 + + // 收集所有奖励项的数据 + $('.' + instanceId + '-reward-item').each(function () { + var $item = $(this); + var rewardType = $item.find('.' + instanceId + '-reward-type-select').val(); + + if (rewardType) { + var rewardObj = { + reward_type: rewardType, + reward_value: '', + coupon_id: '' + }; + + // 根据奖励类型设置相应的值 + if (rewardType == '4') { // 优惠券类型 + rewardObj.coupon_id = $item.find('.' + instanceId + '-coupon-select').val() || ''; + } else { // 其他类型 + rewardObj.reward_value = $item.find('.' + instanceId + '-reward-value-input').val() || ''; + } + + rewardData.push(rewardObj); + } + }); + + if (reward_id === '') { + if ($('input[name="' + fieldName + '"]').length > 0) { + reward_id = $('input[name="' + fieldName + '"]').val(); + } + } + + if (reward_id == '' && rewardData.length == 0) { + layer.msg('请至少添加一项奖励信息', { icon: 2, anim: 6, time: 1500 }); + return false; + } + + // 将奖励数据转换为JSON字符串 + var rewardJson = JSON.stringify(rewardData); + var url = "/admin/reward_add_json.html"; + var load = layer.load(2); + + try { + let l = await $.post(url, { + reward: rewardJson, + reward_id: reward_id, + reward_id_pre: pre + }); + + layer.close(load); + console.log(l); + + if (l && l.status === 1) { + reward_id = l.data.reward_id; + + // 更新reward_id字段 + if ($('input[name="' + fieldName + '"]').length > 0) { + $('input[name="' + fieldName + '"]').val(reward_id); + } else { + $('form').append(''); + } + + return reward_id; + } + return false; + } catch (error) { + layer.close(load); + layer.msg('网络错误,请稍后重试', { icon: 2, anim: 6, time: 1500 }); + return false; + } + } + }; + + return instanceId; } /** - * 验证奖励信息 + * 验证奖励信息 (兼容旧版本调用) + * @param {string} instanceId - 实例ID,为空时使用最后一个实例 * @returns {boolean} - 验证结果 */ -function validateRewardInfo() { - var $ = layui.$; - var hasRewardType = false; - - $('.reward-type-select').each(function () { - if ($(this).val()) { - hasRewardType = true; - var $item = $(this).closest('.reward-item'); - var rewardType = $(this).val(); - - // 如果不是优惠券类型,检查奖励数值 - if (rewardType != '4' && !$item.find('.reward-value-input').val()) { - layer.msg('请输入奖励数值', { icon: 2, anim: 6, time: 1500 }); - hasRewardType = false; - return false; - } - - // 如果是优惠券类型,检查是否选择了优惠券 - if (rewardType == '4' && !$item.find('.coupon-select').val()) { - layer.msg('请选择优惠券', { icon: 2, anim: 6, time: 1500 }); - hasRewardType = false; - return false; - } - } - }); - - if (!hasRewardType) { - layer.msg('请至少添加一项奖励信息', { icon: 2, anim: 6, time: 1500 }); - return false; +function validateRewardInfo(instanceId = null) { + // 如果没有指定实例ID,使用最后创建的实例 + if (!instanceId) { + var instances = Object.keys(rewardInstances); + if (instances.length === 0) return false; + instanceId = instances[instances.length - 1]; } - // 验证通过后,处理奖励数据 - processRewardData(); - return true; + // 如果指定的实例不存在,返回false + if (!rewardInstances[instanceId]) return false; + + // 调用实例的验证方法 + return rewardInstances[instanceId].validateRewardInfo(); } /** - * 处理奖励数据,将其转换为JSON格式并添加到隐藏字段 + * 处理奖励数据 (兼容旧版本调用) + * @param {string} instanceId - 实例ID,为空时使用最后一个实例 */ -function processRewardData() { - var $ = layui.$; - var rewardData = []; - - // 收集所有奖励项的数据 - $('.reward-item').each(function () { - var $item = $(this); - var rewardType = $item.find('.reward-type-select').val(); - - if (rewardType) { - var rewardObj = { - reward_type: rewardType, - reward_value: '', - coupon_id: '' - }; - - // 根据奖励类型设置相应的值 - if (rewardType == '4') { // 优惠券类型 - rewardObj.coupon_id = $item.find('.coupon-select').val() || ''; - } else { // 其他类型 - rewardObj.reward_value = $item.find('.reward-value-input').val() || ''; - } - - rewardData.push(rewardObj); - } - }); - - // 将奖励数据转换为JSON字符串 - var rewardJson = JSON.stringify(rewardData); - - // 检查表单中是否已存在reward隐藏字段 - if ($('input[name="reward"]').length > 0) { - $('input[name="reward"]').val(rewardJson); - } else { - // 创建隐藏字段并添加到表单中 - $('form').append(''); +function processRewardData(instanceId = null) { + // 如果没有指定实例ID,使用最后创建的实例 + if (!instanceId) { + var instances = Object.keys(rewardInstances); + if (instances.length === 0) return; + instanceId = instances[instances.length - 1]; } - // 清除可能残留的旧字段(兼容性考虑) - $('input[name="reward_type[]"], input[name="reward_value[]"], input[name="coupon_id[]"]').remove(); + // 如果指定的实例不存在,直接返回 + if (!rewardInstances[instanceId]) return; + + // 调用实例的数据处理方法 + rewardInstances[instanceId].processRewardData(); } /** - * 处理奖励数据,将其转换为JSON格式并添加到隐藏字段 + * 处理奖励数据,将其转换为JSON格式并添加到隐藏字段 (兼容旧版本调用) + * @param {string} pre - 前缀 + * @param {string} reward_id - 奖励ID + * @param {string} instanceId - 实例ID,为空时使用最后一个实例 + * @returns {Promise} - 返回reward_id或false */ -async function processRewardIdData(pre, reward_id = '') { - var $ = layui.$; - var rewardData = []; - - // 收集所有奖励项的数据 - $('.reward-item').each(function () { - var $item = $(this); - var rewardType = $item.find('.reward-type-select').val(); - - if (rewardType) { - var rewardObj = { - reward_type: rewardType, - reward_value: '', - coupon_id: '' - }; - - // 根据奖励类型设置相应的值 - if (rewardType == '4') { // 优惠券类型 - rewardObj.coupon_id = $item.find('.coupon-select').val() || ''; - } else { // 其他类型 - rewardObj.reward_value = $item.find('.reward-value-input').val() || ''; - } - - rewardData.push(rewardObj); - } - }); - if (reward_id || reward_id == '') { - if ($('input[name="reward_id"]').length > 0) { - reward_id = $('input[name="reward_id"]').val(); - } - } - if (reward_id == '' && rewardData.length == 0) { - layer.msg('请至少添加一项奖励信息', { icon: 2, anim: 6, time: 1500 }); - return false; - } - // 将奖励数据转换为JSON字符串 - var rewardJson = JSON.stringify(rewardData); - // reward_add_json - var url = "/admin/reward_add_json.html"; - var $ = layui.$; - var load = layer.load(2); - let l = await $.post(url, { reward: rewardJson, reward_id: reward_id, reward_id_pre: pre }); - layer.close(load); - console.log(l); - if (l && l.status === 1) { - reward_id = l.data.reward_id; - } - // 检查表单中是否已存在reward隐藏字段 - if ($('input[name="reward_id"]').length > 0) { - $('input[name="reward_id"]').val(reward_id); - } else { - // 创建隐藏字段并添加到表单中 - $('form').append(''); +async function processRewardIdData(pre, reward_id = '', instanceId = null) { + // 如果没有指定实例ID,使用最后创建的实例 + if (!instanceId) { + var instances = Object.keys(rewardInstances); + if (instances.length === 0) return false; + instanceId = instances[instances.length - 1]; } - // 清除可能残留的旧字段(兼容性考虑) - $('input[name="reward_type[]"], input[name="reward_value[]"], input[name="coupon_id[]"]').remove(); + // 如果指定的实例不存在,返回false + if (!rewardInstances[instanceId]) return false; + + // 调用实例的数据处理方法 + return await rewardInstances[instanceId].processRewardIdData(pre, reward_id); } \ No newline at end of file