This commit is contained in:
youda 2025-05-13 00:05:39 +08:00
parent bfa5e94f89
commit 6754ace425
6 changed files with 907 additions and 157 deletions

View File

@ -0,0 +1,189 @@
<?php
namespace app\admin\controller;
use think\facade\View;
use think\facade\Db;
use app\common\model\DiamondProducts;
class Diamond extends Base
{
/**
* 钻石商品列表
*/
public function index()
{
if (request()->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('删除失败');
}
}
}

View File

@ -466,3 +466,11 @@ Route::get('dynamicJs.js', 'Config/dynamicJs')->ext('js');
Route::rule('markdown/index', 'Markdown/index', 'GET|POST'); Route::rule('markdown/index', 'Markdown/index', 'GET|POST');
Route::rule('markdown/order_info', 'Markdown/order_info', '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');

View File

@ -0,0 +1,394 @@
{include file="Public:header3"/}
<body>
<div class="layui-fluid" style="padding-top: 15px;">
<div class="layui-card">
<div class="layui-form layui-card-header layuiadmin-card-header-auto" style="height: 84px;">
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-input-inline" style="width: 300px;margin-left: 0px">
<input type="text" name="name" id="name" placeholder="请输入商品名称" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline" style="width: 180px;margin-left: 0px">
<select name="status" id="status" style="width:100%">
<option value="">--请选择状态--</option>
<option value="1">启用</option>
<option value="0">禁用</option>
</select>
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layuiadmin-btn-useradmin" id="searchBtn">
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
</button>
<button class="layui-btn" id="addBtn">添加钻石商品</button>
</div>
</div>
</div>
<div class="layui-card-body">
<table id="diamondTable" lay-filter="diamondTable"></table>
</div>
</div>
</div>
<!-- 商品状态模板 -->
<script type="text/html" id="statusTpl">
{{# if(d.status == 1){ }}
<button class="layui-btn layui-btn-normal layui-btn-radius layui-btn-sm">启用</button>
{{# } else { }}
<button class="layui-btn layui-btn-danger layui-btn-radius layui-btn-sm">禁用</button>
{{# } }}
</script>
<!-- 是否首充模板 -->
<script type="text/html" id="isFirstTpl">
{{# if(d.is_first == 1){ }}
<button class="layui-btn layui-btn-warm layui-btn-radius layui-btn-sm"></button>
{{# } else { }}
<button class="layui-btn layui-btn-primary layui-btn-radius layui-btn-sm"></button>
{{# } }}
</script>
<!-- 图片模板 -->
<script type="text/html" id="imageTpl">
{{# if(d.normal_image){ }}
<img src="{{d.normal_image}}" style="max-width: 80px; max-height: 80px;">
{{# } }}
</script>
<!-- 操作栏模板 -->
<script type="text/html" id="toolbarTpl">
<a style="text-decoration:none" title="编辑" lay-event="edit" class="layui-btn layui-btn-normal layui-btn-xs">
<i class="layui-icon layui-icon-edit"></i>编辑
</a>
<a style="text-decoration:none" lay-event="delete" class="layui-btn layui-btn-danger layui-btn-xs">
<i class="layui-icon layui-icon-delete"></i>删除
</a>
</script>
<!-- 添加/编辑表单模板 -->
<script type="text/html" id="formTpl">
<form class="layui-form" lay-filter="diamondForm" id="diamondForm" style="padding: 20px;">
<input type="hidden" name="id" value="{{d.id}}">
<!-- 第一行商品名称、商品ID -->
<div class="layui-form-item">
<label class="layui-form-label">商品名称</label>
<div class="layui-input-inline">
<input type="text" name="name" value="{{d.name}}" placeholder="请输入商品名称" class="layui-input">
</div>
<label class="layui-form-label">商品编号</label>
<div class="layui-input-inline">
<input type="text" name="products_id" value="{{d.products_id}}" placeholder="请输入商品ID" class="layui-input">
</div>
</div>
<!-- 第二行:商品类型、价格 -->
<div class="layui-form-item">
<label class="layui-form-label">商品类型</label>
<div class="layui-input-inline">
<select name="products_type" class="layui-input">
<option value="1" {{# if(d.products_type == '1' || !d.products_type){ }}selected{{# } }}>钻石商城</option>
</select>
</div>
<label class="layui-form-label">价格</label>
<div class="layui-input-inline">
<input type="text" name="price" value="{{d.price}}" placeholder="请输入价格" class="layui-input">
</div>
</div>
<!-- 第三行:基础钻石(单独一行) -->
<div class="layui-form-item">
<label class="layui-form-label">赠送货币</label>
<div class="layui-input-inline" style="width: 80%;">
<!-- <input type="text" name="base_reward" value="{{d.base_reward}}" placeholder="请输入基础钻石数量" class="layui-input"> -->
<div id="base_reward_container" style="width: 100%;"></div>
</div>
</div>
<!-- 第四行:非首充展示图、非首充选中图 -->
<div class="layui-form-item">
<label class="layui-form-label">非首充展示图</label>
<div class="layui-input-inline">
<input type="hidden" name="normal_image" value="{{d.normal_image}}" class="layui-input">
<img style="float:left;width:120px;height:171.53rpx;cursor:pointer;" class="upload-image" id="normal_image_preview" data-target="normal_image" src="{{d.normal_image || '/static/image/upload.jpg'}}">
</div>
<label class="layui-form-label">非首充选中图</label>
<div class="layui-input-inline">
<input type="hidden" name="normal_select_image" value="{{d.normal_select_image}}" class="layui-input">
<img style="float:left;width:120px;height:171.53rpx;cursor:pointer;" class="upload-image" id="normal_select_image_preview" data-target="normal_select_image" src="{{d.normal_select_image || '/static/image/upload.jpg'}}">
</div>
</div>
<!-- 第五行:是否首充(单独一行) -->
<div class="layui-form-item">
<label class="layui-form-label">是否首充</label>
<div class="layui-input-inline">
<input type="radio" name="is_first" value="1" title="是" lay-filter="is_first" {{# if(d.is_first == 1){ }}checked{{# } }}>
<input type="radio" name="is_first" value="0" title="否" lay-filter="is_first" {{# if(d.is_first == 0){ }}checked{{# } }}>
</div>
</div>
<!-- 第六行:首充赠送金额(条件显示,单独一行) -->
<div class="first-charge-fields layui-form-item" style="{{# if(d.is_first != 1){ }}display: none;{{# } }}">
<label class="layui-form-label" >首充额外赠送货币</label>
<div class="layui-input-inline" style="width: 80%;">
<div id="first_bonus_reward_container" style="width: 100%;"></div>
</div>
</div>
<!-- 第七行:首充展示图、首充选中图(条件显示) -->
<div class="first-charge-fields layui-form-item" style="{{# if(d.is_first != 1){ }}display: none;{{# } }}">
<label class="layui-form-label">首充展示图</label>
<div class="layui-input-inline">
<input type="hidden" name="first_charge_image" value="{{d.first_charge_image}}" class="layui-input">
<img style="float:left;width:120px;height:171.53rpx;cursor:pointer;" class="upload-image" id="first_charge_image_preview" data-target="first_charge_image" src="{{d.first_charge_image || '/static/image/upload.jpg'}}">
</div>
<label class="layui-form-label">首充选中图</label>
<div class="layui-input-inline">
<input type="hidden" name="first_select_charge_image" value="{{d.first_select_charge_image}}" class="layui-input">
<img style="float:left;width:120px;height:171.53rpx;cursor:pointer;" class="upload-image" id="first_select_charge_image_preview" data-target="first_select_charge_image" src="{{d.first_select_charge_image || '/static/image/upload.jpg'}}">
</div>
</div>
<!-- 第八行:排序值、状态 -->
<div class="layui-form-item">
<label class="layui-form-label">排序值</label>
<div class="layui-input-inline">
<input type="text" name="sort_order" value="{{d.sort_order}}" placeholder="请输入排序值" class="layui-input">
</div>
<label class="layui-form-label">状态</label>
<div class="layui-input-inline">
<input type="radio" name="status" value="1" title="启用" {{# if(d.status == 1){ }}checked{{# } }}>
<input type="radio" name="status" value="0" title="禁用" {{# if(d.status == 0){ }}checked{{# } }}>
</div>
</div>
<div class="layui-form-item" style="text-align: center;">
<div class="layui-input-block" style="margin-left: 0;">
<button class="layui-btn" lay-submit lay-filter="diamondFormSubmit">立即提交</button>
<button type="button" class="layui-btn layui-btn-primary closeBtn">关闭</button>
</div>
</div>
</form>
</script>
{include file="Public:footer3"/}
<script type="text/javascript">
layui.use(['layer', 'table', 'form', 'upload'], function () {
var table = layui.table;
var layer = layui.layer;
var form = layui.form;
var upload = layui.upload;
var laytpl = layui.laytpl;
// 初始化表格
table.render({
elem: '#diamondTable',
url: '{:url("/admin/diamond")}',
height: 'full-120',
lineStyle: 'height:100px',
cols: [[
{ field: 'id', title: 'ID', width: 80, sort: true },
{ field: 'name', title: '商品名称', width: 150 },
{ field: 'products_id', title: '商品ID', width: 150 },
// { field: 'base_reward', title: '基础钻石数量', width: 120 },
{ field: 'price', title: '价格(元)', width: 100 },
{ field: 'is_first', title: '是否有首充', width: 100, templet: '#isFirstTpl' },
{ field: 'normal_image', title: '展示图', width: 120, templet: '#imageTpl' },
{ field: 'sort_order', title: '排序', width: 80 },
{ field: 'status', title: '状态', width: 80, templet: '#statusTpl' },
{ field: 'created_at', title: '创建时间', width: 160 },
{ field: 'updated_at', title: '更新时间', width: 160 },
{ fixed: 'right', title: '操作', toolbar: '#toolbarTpl', width: 150 }
]],
page: true,
limit: 15,
skin: 'line'
});
// 搜索按钮点击事件
$('#searchBtn').on('click', function () {
var name = $('#name').val();
var status = $('#status').val();
// 重载表格
table.reload('diamondTable', {
where: {
name: name,
status: status
},
page: {
curr: 1
}
});
});
var base_reward_instance = null;
var first_bonus_reward_instance = null;
// 添加按钮点击事件
$('#addBtn').on('click', function () {
layer.open({
type: 1,
title: '添加钻石商品',
area: ['900px', '90%'],
content: laytpl($('#formTpl').html()).render({ d: {} }),
success: function (layero, index) {
form.render();
initUpload();
// 页面加载时初始化奖励信息区域
base_reward_instance = initRewardInfo('base_reward_container', null, 'base_reward');
console.log(base_reward_instance);
first_bonus_reward_instance = initRewardInfo('first_bonus_reward_container', null, 'first_bonus_reward');
// 监听关闭按钮点击事件
$('.closeBtn').on('click', function() {
layer.closeAll('page');
});
// 监听是否首充单选框变化
form.on('radio(is_first)', function (data) {
var value = data.value;
if (value == 1) {
$(data.elem).closest('.layui-form').find('.first-charge-fields').show();
} else {
$(data.elem).closest('.layui-form').find('.first-charge-fields').hide();
}
});
}
});
});
// 监听工具条
table.on('tool(diamondTable)', function (obj) {
var data = obj.data;
var layEvent = obj.event;
if (layEvent === 'edit') {
// 编辑
layer.open({
type: 1,
title: '编辑钻石商品',
area: ['800px', '90%'],
content: laytpl($('#formTpl').html()).render({ d: data }),
success: function (layero, index) {
form.render();
initUpload();
console.log(data);
// 页面加载时初始化奖励信息区域
base_reward_instance = initRewardInfo('base_reward_container', data.base_reward, 'base_reward');
console.log(base_reward_instance);
first_bonus_reward_instance = initRewardInfo('first_bonus_reward_container', data.first_bonus_reward, 'first_bonus_reward');
form.val('diamondForm', data);
// 监听关闭按钮点击事件
$('.closeBtn').on('click', function() {
layer.closeAll('page');
});
// 监听是否首充单选框变化
form.on('radio(is_first)', function (data) {
var value = data.value;
if (value == 1) {
$(data.elem).closest('.layui-form').find('.first-charge-fields').show();
} else {
$(data.elem).closest('.layui-form').find('.first-charge-fields').hide();
}
});
if(data.is_first==1){
$('.first-charge-fields').show();
}else{
$('.first-charge-fields').hide();
}
form.render();
$('#normal_image_preview').attr('src', data.normal_image);
if (data.first_charge_image != null && data.first_charge_image != "") {
$('#first_charge_image_preview').attr('src', data.first_charge_image);
}
$('#normal_select_image_preview').attr('src', data.normal_select_image);
if (data.first_select_charge_image != null && data.first_select_charge_image != "") {
$('#first_select_charge_image_preview').attr('src', data.first_select_charge_image);
}
}
});
} else if (layEvent === 'delete') {
// 删除
layer.confirm('确定要删除该商品吗?', { icon: 3, title: '提示' }, function (index) {
$.ajax({
url: '{:url("/admin/diamond_del")}',
type: 'post',
data: { id: data.id },
success: function (res) {
if (res.status === 1) {
layer.msg(res.msg, { icon: 1, time: 1000 }, function () {
table.reload('diamondTable');
});
} else {
layer.msg(res.msg, { icon: 2, time: 1500 });
}
}
});
layer.close(index);
});
}
});
// 监听表单提交
form.on('submit(diamondFormSubmit)', function (data) {
(async () => {
var load = layer.load(2);
console.log(data);
var url = data.field.id ? '{:url("/admin/diamond_edit")}' : '{:url("/admin/diamond_add")}';
await rewardInstances[base_reward_instance].processRewardIdData("PRODUCT");
await rewardInstances[first_bonus_reward_instance].processRewardIdData("PRODUCT");
var formData = $("#diamondForm").serialize();
console.log(formData);
$.post(url, formData, function (res) {
layer.close(load);
if (res.status === 1) {
layer.msg(res.msg, { icon: 1, time: 1000 }, function () {
layer.closeAll('page');
table.reload('diamondTable');
});
} else {
layer.msg(res.msg, { icon: 2, anim: 6, time: 1500 });
}
});
})();
return false;
});
// 初始化图片上传
function initUpload() {
$('.upload-image').each(function () {
var targetInput = $(this).data('target');
var previewImg = this;
upload.render({
elem: this,
url: '{:url("/admin/picture")}',
accept: 'images',
acceptMime: 'image/*',
done: function (res) {
if (res.status === 1) {
$('input[name="' + targetInput + '"]').val(res.data.imgurl);
$(previewImg).attr('src', res.data.imgurl);
layer.msg('上传成功', { icon: 1 });
} else {
layer.msg(res.msg, { icon: 2, anim: 6 });
}
}
});
});
}
});
</script>
</body>
</html>

View File

@ -0,0 +1,79 @@
<?php
namespace app\common\model;
use think\Model;
use think\facade\Db;
class DiamondProducts extends Base
{
//设置主键
protected $pk = 'id';
//设置表名
protected $table = 'diamond_products';
//设置自动时间戳
protected $autoWriteTimestamp = true;
protected $createTime = 'created_at';
protected $updateTime = 'updated_at';
/**
* 获取钻石商品列表
* @param array $where 条件
* @param int $page 页码
* @param int $limit 每页数据量
* @return array
*/
public static function getList($where = [], $page = 1, $limit = 10)
{
$query = self::where($where);
$count = $query->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();
}
}

View File

@ -86,6 +86,11 @@ return [
'url' => '/admin/card_shang', 'url' => '/admin/card_shang',
'name' => '抽奖等级设置', 'name' => '抽奖等级设置',
], ],
[
'url' => '/admin/diamond',
'name' => '钻石商品配置',
],
], ],
], ],
[ [

View File

@ -3,15 +3,23 @@
* 用于创建和管理奖励信息表单元素 * 用于创建和管理奖励信息表单元素
*/ */
// 存储所有实例的映射
var rewardInstances = {};
/** /**
* 初始化奖励信息区域 * 初始化奖励信息区域
* @param {string} containerId - 容器ID * @param {string} containerId - 容器ID
* @param {Array|string} existingRewards - 已存在的奖励数据数组或reward_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 $ = layui.$;
var form = layui.form; var form = layui.form;
// 创建实例ID
var instanceId = containerId + '_' + new Date().getTime();
// 奖励类型选项 // 奖励类型选项
var rewardTypes = [ var rewardTypes = [
{ value: '1', text: '钻石' }, { value: '1', text: '钻石' },
@ -23,21 +31,24 @@ function initRewardInfo(containerId, existingRewards = null) {
// 存储优惠券数据 // 存储优惠券数据
var couponsData = []; var couponsData = [];
// 创建奖励信息卡片 // 创建奖励信息卡片 - 使用实例化ID
var cardHtml = '<div class="layui-card">' + var cardHtml = '<div class="layui-card">' +
'<div class="layui-card-header">' + '<div class="layui-card-header">' +
'<button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="addReward">' + '<button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="' + instanceId + '_addReward">' +
'<i class="layui-icon">&#xe654;</i>添加奖励' + '<i class="layui-icon">&#xe654;</i>添加奖励' +
'</button>' + '</button>' +
'</div>' + '</div>' +
'<div class="layui-card-body">' + '<div class="layui-card-body">' +
'<div id="rewardContainer">' + '<div id="' + instanceId + '_rewardContainer">' +
'<!-- 动态添加的奖励项将显示在这里 -->' + '<!-- 动态添加的奖励项将显示在这里 -->' +
'</div>' + '</div>' +
'</div>' + '</div>' +
'</div>'; '</div>';
if ($('input[name="reward_id"]').length == 0) {
cardHtml += '<input type="hidden" name="reward_id" value="">'; // 只有在不存在同名字段时添加隐藏字段
if ($('#' + containerId + ' input[name="' + fieldName + '"]').length == 0 &&
$('input[name="' + fieldName + '"]').length == 0) {
cardHtml += '<input type="hidden" name="' + fieldName + '" value="">';
} }
// 渲染奖励信息卡片 // 渲染奖励信息卡片
@ -70,15 +81,15 @@ function initRewardInfo(containerId, existingRewards = null) {
// 生成唯一ID // 生成唯一ID
function generateUniqueId() { 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) { function addRewardItem(rewardData = null) {
var uniqueId = generateUniqueId(); var uniqueId = generateUniqueId();
var html = '<div class="layui-form-item reward-item" id="' + uniqueId + '">' + var html = '<div class="layui-form-item ' + instanceId + '-reward-item" id="' + uniqueId + '">' +
'<div class="layui-inline">' + '<div class="layui-inline">' +
'<select class="reward-type-select" lay-filter="rewardTypeFilter">' + '<select class="' + instanceId + '-reward-type-select" lay-filter="' + instanceId + 'RewardTypeFilter">' +
'<option value="">请选择奖励类型</option>'; '<option value="">请选择奖励类型</option>';
// 添加奖励类型选项 // 添加奖励类型选项
@ -95,27 +106,27 @@ function initRewardInfo(containerId, existingRewards = null) {
var couponDisplay = (!rewardData || rewardData.reward_type != '4') ? 'style="display:none;"' : ''; var couponDisplay = (!rewardData || rewardData.reward_type != '4') ? 'style="display:none;"' : '';
var rewardValue = rewardData ? rewardData.reward_value : ''; var rewardValue = rewardData ? rewardData.reward_value : '';
html += '<div class="layui-inline reward-value-container" ' + rewardValueDisplay + '>' + html += '<div class="layui-inline ' + instanceId + '-reward-value-container" ' + rewardValueDisplay + '>' +
'<input type="text" placeholder="请输入奖励数值" class="layui-input reward-value-input" value="' + rewardValue + '">' + '<input type="text" placeholder="请输入奖励数值" class="layui-input ' + instanceId + '-reward-value-input" value="' + rewardValue + '">' +
'</div>' + '</div>' +
'<div class="layui-inline coupon-container" ' + couponDisplay + '>' + '<div class="layui-inline ' + instanceId + '-coupon-container" ' + couponDisplay + '>' +
'<select class="coupon-select">' + '<select class="' + instanceId + '-coupon-select">' +
'<option value="">请选择优惠券</option>' + '<option value="">请选择优惠券</option>' +
'<option value="loading" disabled>加载中...</option>' + '<option value="loading" disabled>加载中...</option>' +
'</select>' + '</select>' +
'</div>' + '</div>' +
'<div class="layui-inline">' + '<div class="layui-inline">' +
'<button type="button" class="layui-btn layui-btn-danger layui-btn-sm remove-reward" data-id="' + uniqueId + '">' + '<button type="button" class="layui-btn layui-btn-danger layui-btn-sm ' + instanceId + '-remove-reward" data-id="' + uniqueId + '">' +
'<i class="layui-icon">&#xe640;</i>删除' + '<i class="layui-icon">&#xe640;</i>删除' +
'</button>' + '</button>' +
'</div>' + '</div>' +
'</div>'; '</div>';
$('#rewardContainer').append(html); $('#' + instanceId + '_rewardContainer').append(html);
form.render('select'); // 重新渲染表单 form.render('select'); // 重新渲染表单
// 绑定删除按钮事件 // 绑定删除按钮事件
$('.remove-reward[data-id="' + uniqueId + '"]').click(function () { $('.' + instanceId + '-remove-reward[data-id="' + uniqueId + '"]').click(function () {
var id = $(this).data('id'); var id = $(this).data('id');
$('#' + id).remove(); $('#' + id).remove();
}); });
@ -123,7 +134,7 @@ function initRewardInfo(containerId, existingRewards = null) {
// 如果是优惠券类型,需要加载优惠券数据 // 如果是优惠券类型,需要加载优惠券数据
if (rewardData && rewardData.reward_type == '4') { if (rewardData && rewardData.reward_type == '4') {
var $item = $('#' + uniqueId); var $item = $('#' + uniqueId);
var $couponSelect = $item.find('.coupon-select'); var $couponSelect = $item.find('.' + instanceId + '-coupon-select');
// 获取优惠券数据并选中指定的优惠券 // 获取优惠券数据并选中指定的优惠券
if (couponsData.length > 0) { if (couponsData.length > 0) {
@ -139,22 +150,22 @@ function initRewardInfo(containerId, existingRewards = null) {
} }
// 添加奖励按钮点击事件 // 添加奖励按钮点击事件
$('#addReward').click(function () { $('#' + instanceId + '_addReward').click(function () {
addRewardItem(); addRewardItem();
}); });
// 监听奖励类型选择 // 监听奖励类型选择
form.on('select(rewardTypeFilter)', function (data) { form.on('select(' + instanceId + 'RewardTypeFilter)', function (data) {
var $item = $(data.elem).closest('.reward-item'); var $item = $(data.elem).closest('.' + instanceId + '-reward-item');
var value = data.value; var value = data.value;
if (value == '4') { // 选择了优惠券 if (value == '4') { // 选择了优惠券
$item.find('.reward-value-container').hide(); $item.find('.' + instanceId + '-reward-value-container').hide();
$item.find('.coupon-container').show(); $item.find('.' + instanceId + '-coupon-container').show();
$item.find('.reward-value-input').val(''); // 清空奖励数值 $item.find('.' + instanceId + '-reward-value-input').val(''); // 清空奖励数值
// 获取当前选择框的优惠券选择框 // 获取当前选择框的优惠券选择框
var $couponSelect = $item.find('.coupon-select'); var $couponSelect = $item.find('.' + instanceId + '-coupon-select');
// 如果优惠券数据已加载,直接填充 // 如果优惠券数据已加载,直接填充
if (couponsData.length > 0) { if (couponsData.length > 0) {
@ -166,9 +177,9 @@ function initRewardInfo(containerId, existingRewards = null) {
}); });
} }
} else { } else {
$item.find('.reward-value-container').show(); $item.find('.' + instanceId + '-reward-value-container').show();
$item.find('.coupon-container').hide(); $item.find('.' + instanceId + '-coupon-container').hide();
$item.find('.coupon-select').val(''); // 清空优惠券选择 $item.find('.' + instanceId + '-coupon-select').val(''); // 清空优惠券选择
form.render('select'); form.render('select');
} }
}); });
@ -207,8 +218,8 @@ function initRewardInfo(containerId, existingRewards = null) {
layer.close(loadingIndex); layer.close(loadingIndex);
if (res.status === 1 && res.data && res.data.length > 0) { if (res.status === 1 && res.data && res.data.length > 0) {
// 先获取优惠券数据,再初始化奖励表单 // 先获取优惠券数据,再初始化奖励表单
if ($('input[name="reward_id"]').length > 0) { if ($('input[name="' + fieldName + '"]').length > 0) {
$('input[name="reward_id"]').val(rewardId); $('input[name="' + fieldName + '"]').val(rewardId);
} }
fetchCoupons(function () { fetchCoupons(function () {
// 遍历奖励数据,添加奖励项 // 遍历奖励数据,添加奖励项
@ -244,31 +255,28 @@ function initRewardInfo(containerId, existingRewards = null) {
// 预加载优惠券数据,以便后续使用 // 预加载优惠券数据,以便后续使用
fetchCoupons(); fetchCoupons();
} }
}
/** // 存储实例相关数据
* 验证奖励信息 rewardInstances[instanceId] = {
* @returns {boolean} - 验证结果 containerId: containerId,
*/ fieldName: fieldName,
function validateRewardInfo() { validateRewardInfo: function () {
var $ = layui.$;
var hasRewardType = false; var hasRewardType = false;
$('.' + instanceId + '-reward-type-select').each(function () {
$('.reward-type-select').each(function () {
if ($(this).val()) { if ($(this).val()) {
hasRewardType = true; hasRewardType = true;
var $item = $(this).closest('.reward-item'); var $item = $(this).closest('.' + instanceId + '-reward-item');
var rewardType = $(this).val(); var rewardType = $(this).val();
// 如果不是优惠券类型,检查奖励数值 // 如果不是优惠券类型,检查奖励数值
if (rewardType != '4' && !$item.find('.reward-value-input').val()) { if (rewardType != '4' && !$item.find('.' + instanceId + '-reward-value-input').val()) {
layer.msg('请输入奖励数值', { icon: 2, anim: 6, time: 1500 }); layer.msg('请输入奖励数值', { icon: 2, anim: 6, time: 1500 });
hasRewardType = false; hasRewardType = false;
return false; return false;
} }
// 如果是优惠券类型,检查是否选择了优惠券 // 如果是优惠券类型,检查是否选择了优惠券
if (rewardType == '4' && !$item.find('.coupon-select').val()) { if (rewardType == '4' && !$item.find('.' + instanceId + '-coupon-select').val()) {
layer.msg('请选择优惠券', { icon: 2, anim: 6, time: 1500 }); layer.msg('请选择优惠券', { icon: 2, anim: 6, time: 1500 });
hasRewardType = false; hasRewardType = false;
return false; return false;
@ -282,21 +290,16 @@ function validateRewardInfo() {
} }
// 验证通过后,处理奖励数据 // 验证通过后,处理奖励数据
processRewardData(); this.processRewardData();
return true; return true;
} },
processRewardData: function () {
/**
* 处理奖励数据将其转换为JSON格式并添加到隐藏字段
*/
function processRewardData() {
var $ = layui.$;
var rewardData = []; var rewardData = [];
// 收集所有奖励项的数据 // 收集所有奖励项的数据
$('.reward-item').each(function () { $('.' + instanceId + '-reward-item').each(function () {
var $item = $(this); var $item = $(this);
var rewardType = $item.find('.reward-type-select').val(); var rewardType = $item.find('.' + instanceId + '-reward-type-select').val();
if (rewardType) { if (rewardType) {
var rewardObj = { var rewardObj = {
@ -307,9 +310,9 @@ function processRewardData() {
// 根据奖励类型设置相应的值 // 根据奖励类型设置相应的值
if (rewardType == '4') { // 优惠券类型 if (rewardType == '4') { // 优惠券类型
rewardObj.coupon_id = $item.find('.coupon-select').val() || ''; rewardObj.coupon_id = $item.find('.' + instanceId + '-coupon-select').val() || '';
} else { // 其他类型 } else { // 其他类型
rewardObj.reward_value = $item.find('.reward-value-input').val() || ''; rewardObj.reward_value = $item.find('.' + instanceId + '-reward-value-input').val() || '';
} }
rewardData.push(rewardObj); rewardData.push(rewardObj);
@ -319,29 +322,22 @@ function processRewardData() {
// 将奖励数据转换为JSON字符串 // 将奖励数据转换为JSON字符串
var rewardJson = JSON.stringify(rewardData); var rewardJson = JSON.stringify(rewardData);
// 检查表单中是否已存在reward隐藏字段 // 创建或更新reward字段名
if ($('input[name="reward"]').length > 0) { var rewardDataFieldName = 'reward_' + fieldName.replace('_id', '');
$('input[name="reward"]').val(rewardJson); if ($('input[name="' + rewardDataFieldName + '"]').length > 0) {
$('input[name="' + rewardDataFieldName + '"]').val(rewardJson);
} else { } else {
// 创建隐藏字段并添加到表单中 $('form').append('<input type="hidden" name="' + rewardDataFieldName + '" value=\'' + rewardJson + '\'>');
$('form').append('<input type="hidden" name="reward" value=\'' + rewardJson + '\'>');
} }
},
// 清除可能残留的旧字段(兼容性考虑) processRewardIdData: async function (pre, reward_id = '') {
$('input[name="reward_type[]"], input[name="reward_value[]"], input[name="coupon_id[]"]').remove();
}
/**
* 处理奖励数据将其转换为JSON格式并添加到隐藏字段
*/
async function processRewardIdData(pre, reward_id = '') {
var $ = layui.$;
var rewardData = []; var rewardData = [];
var $ = layui.$; // 确保在异步函数内部重新获取jQuery引用
// 收集所有奖励项的数据 // 收集所有奖励项的数据
$('.reward-item').each(function () { $('.' + instanceId + '-reward-item').each(function () {
var $item = $(this); var $item = $(this);
var rewardType = $item.find('.reward-type-select').val(); var rewardType = $item.find('.' + instanceId + '-reward-type-select').val();
if (rewardType) { if (rewardType) {
var rewardObj = { var rewardObj = {
@ -352,43 +348,122 @@ async function processRewardIdData(pre, reward_id = '') {
// 根据奖励类型设置相应的值 // 根据奖励类型设置相应的值
if (rewardType == '4') { // 优惠券类型 if (rewardType == '4') { // 优惠券类型
rewardObj.coupon_id = $item.find('.coupon-select').val() || ''; rewardObj.coupon_id = $item.find('.' + instanceId + '-coupon-select').val() || '';
} else { // 其他类型 } else { // 其他类型
rewardObj.reward_value = $item.find('.reward-value-input').val() || ''; rewardObj.reward_value = $item.find('.' + instanceId + '-reward-value-input').val() || '';
} }
rewardData.push(rewardObj); rewardData.push(rewardObj);
} }
}); });
if (reward_id || reward_id == '') {
if ($('input[name="reward_id"]').length > 0) { if (reward_id === '') {
reward_id = $('input[name="reward_id"]').val(); if ($('input[name="' + fieldName + '"]').length > 0) {
reward_id = $('input[name="' + fieldName + '"]').val();
} }
} }
if (reward_id == '' && rewardData.length == 0) { if (reward_id == '' && rewardData.length == 0) {
layer.msg('请至少添加一项奖励信息', { icon: 2, anim: 6, time: 1500 }); layer.msg('请至少添加一项奖励信息', { icon: 2, anim: 6, time: 1500 });
return false; return false;
} }
// 将奖励数据转换为JSON字符串 // 将奖励数据转换为JSON字符串
var rewardJson = JSON.stringify(rewardData); var rewardJson = JSON.stringify(rewardData);
// reward_add_json
var url = "/admin/reward_add_json.html"; var url = "/admin/reward_add_json.html";
var $ = layui.$;
var load = layer.load(2); var load = layer.load(2);
let l = await $.post(url, { reward: rewardJson, reward_id: reward_id, reward_id_pre: pre });
try {
let l = await $.post(url, {
reward: rewardJson,
reward_id: reward_id,
reward_id_pre: pre
});
layer.close(load); layer.close(load);
console.log(l); console.log(l);
if (l && l.status === 1) { if (l && l.status === 1) {
reward_id = l.data.reward_id; reward_id = l.data.reward_id;
}
// 检查表单中是否已存在reward隐藏字段 // 更新reward_id字段
if ($('input[name="reward_id"]').length > 0) { if ($('input[name="' + fieldName + '"]').length > 0) {
$('input[name="reward_id"]').val(reward_id); $('input[name="' + fieldName + '"]').val(reward_id);
} else { } else {
// 创建隐藏字段并添加到表单中 $('form').append('<input type="hidden" name="' + fieldName + '" value="' + reward_id + '">');
$('form').append('<input type="hidden" name="reward_id" value=\'' + reward_id + '\'>');
} }
// 清除可能残留的旧字段(兼容性考虑) return reward_id;
$('input[name="reward_type[]"], input[name="reward_value[]"], input[name="coupon_id[]"]').remove(); }
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(instanceId = null) {
// 如果没有指定实例ID使用最后创建的实例
if (!instanceId) {
var instances = Object.keys(rewardInstances);
if (instances.length === 0) return false;
instanceId = instances[instances.length - 1];
}
// 如果指定的实例不存在返回false
if (!rewardInstances[instanceId]) return false;
// 调用实例的验证方法
return rewardInstances[instanceId].validateRewardInfo();
}
/**
* 处理奖励数据 (兼容旧版本调用)
* @param {string} instanceId - 实例ID为空时使用最后一个实例
*/
function processRewardData(instanceId = null) {
// 如果没有指定实例ID使用最后创建的实例
if (!instanceId) {
var instances = Object.keys(rewardInstances);
if (instances.length === 0) return;
instanceId = instances[instances.length - 1];
}
// 如果指定的实例不存在,直接返回
if (!rewardInstances[instanceId]) return;
// 调用实例的数据处理方法
rewardInstances[instanceId].processRewardData();
}
/**
* 处理奖励数据将其转换为JSON格式并添加到隐藏字段 (兼容旧版本调用)
* @param {string} pre - 前缀
* @param {string} reward_id - 奖励ID
* @param {string} instanceId - 实例ID为空时使用最后一个实例
* @returns {Promise<string|boolean>} - 返回reward_id或false
*/
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];
}
// 如果指定的实例不存在返回false
if (!rewardInstances[instanceId]) return false;
// 调用实例的数据处理方法
return await rewardInstances[instanceId].processRewardIdData(pre, reward_id);
} }