323 lines
11 KiB
JavaScript
323 lines
11 KiB
JavaScript
|
|
// 等级编辑页面的JavaScript逻辑
|
||
|
|
|
||
|
|
let currentShopName = '';
|
||
|
|
let currentLevels = [];
|
||
|
|
|
||
|
|
// 获取URL参数
|
||
|
|
function getUrlParameter(name) {
|
||
|
|
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
|
||
|
|
const regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
||
|
|
const results = regex.exec(location.search);
|
||
|
|
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
|
||
|
|
}
|
||
|
|
|
||
|
|
// 页面初始化
|
||
|
|
document.addEventListener('DOMContentLoaded', function() {
|
||
|
|
currentShopName = getUrlParameter('shop');
|
||
|
|
if (currentShopName) {
|
||
|
|
document.getElementById('page-title').textContent = `${currentShopName} - 等级编辑`;
|
||
|
|
loadLevelEditData();
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// 加载等级编辑数据
|
||
|
|
function loadLevelEditData() {
|
||
|
|
// 模拟等级编辑数据
|
||
|
|
currentLevels = [
|
||
|
|
{
|
||
|
|
level: 'LV1',
|
||
|
|
name: '铜牌会员',
|
||
|
|
growthMin: 0,
|
||
|
|
growthMax: 100,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 5,
|
||
|
|
pointExchange: false,
|
||
|
|
birthdayCoupon: false,
|
||
|
|
birthdayDoublePoints: false
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV2',
|
||
|
|
name: '银牌会员',
|
||
|
|
growthMin: 101,
|
||
|
|
growthMax: 500,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 10,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV3',
|
||
|
|
name: '金牌会员',
|
||
|
|
growthMin: 501,
|
||
|
|
growthMax: 1200,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 15,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV4',
|
||
|
|
name: '钻石会员',
|
||
|
|
growthMin: 1201,
|
||
|
|
growthMax: 9999,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 20,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
}
|
||
|
|
];
|
||
|
|
|
||
|
|
renderLevelEditTable();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 渲染等级编辑表格
|
||
|
|
function renderLevelEditTable() {
|
||
|
|
const tableBody = document.getElementById('level-edit-table-body');
|
||
|
|
tableBody.innerHTML = currentLevels.map((level, index) => `
|
||
|
|
<tr>
|
||
|
|
<td class="px-3 py-3 text-sm text-gray-900">${level.level}</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<input type="text" value="${level.name}" class="w-full text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none" id="levelName_${index}">
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<div class="flex items-center gap-1">
|
||
|
|
<input type="number" value="${level.growthMin}" class="w-16 text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none" id="growthMin_${index}">
|
||
|
|
<span class="text-gray-500">-</span>
|
||
|
|
<input type="number" value="${level.growthMax}" class="w-16 text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none" id="growthMax_${index}">
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<input type="checkbox" ${level.memberDiscount ? 'checked' : ''} id="memberDiscount_${index}" onchange="toggleDiscountRate(${index})">
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<input type="number" value="${level.discountRate}" class="w-16 text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none ${!level.memberDiscount ? 'bg-gray-100' : ''}" id="discountRate_${index}" ${!level.memberDiscount ? 'disabled' : ''}>
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<input type="checkbox" ${level.pointExchange ? 'checked' : ''} id="pointExchange_${index}">
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<input type="checkbox" ${level.birthdayCoupon ? 'checked' : ''} id="birthdayCoupon_${index}" onchange="toggleCouponButton(${index})">
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<button class="px-3 py-1 text-xs text-green-600 border border-green-600 rounded hover:bg-green-50 transition-colors ${!level.birthdayCoupon ? 'hidden' : ''}" id="addCouponBtn_${index}" onclick="addBirthdayCoupon(${index})">
|
||
|
|
添加优惠券
|
||
|
|
</button>
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<input type="checkbox" ${level.birthdayDoublePoints ? 'checked' : ''} id="birthdayDoublePoints_${index}">
|
||
|
|
</td>
|
||
|
|
<td class="px-3 py-3">
|
||
|
|
<div class="flex gap-2">
|
||
|
|
${index === currentLevels.length - 1 ? `
|
||
|
|
<button class="px-2 py-1 text-xs bg-green-600 text-white rounded hover:bg-green-700" onclick="addNewLevel()">
|
||
|
|
添加
|
||
|
|
</button>
|
||
|
|
` : ''}
|
||
|
|
<button class="px-2 py-1 text-xs bg-red-600 text-white rounded hover:bg-red-700" onclick="deleteLevel(${index})">
|
||
|
|
删除
|
||
|
|
</button>
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
`).join('');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 切换折扣率输入框状态
|
||
|
|
function toggleDiscountRate(index) {
|
||
|
|
const checkbox = document.getElementById(`memberDiscount_${index}`);
|
||
|
|
const discountInput = document.getElementById(`discountRate_${index}`);
|
||
|
|
|
||
|
|
if (checkbox && discountInput) {
|
||
|
|
if (checkbox.checked) {
|
||
|
|
discountInput.disabled = false;
|
||
|
|
discountInput.classList.remove('bg-gray-100');
|
||
|
|
} else {
|
||
|
|
discountInput.disabled = true;
|
||
|
|
discountInput.classList.add('bg-gray-100');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 切换优惠券按钮显示
|
||
|
|
function toggleCouponButton(index) {
|
||
|
|
const checkbox = document.getElementById(`birthdayCoupon_${index}`);
|
||
|
|
const addButton = document.getElementById(`addCouponBtn_${index}`);
|
||
|
|
|
||
|
|
if (checkbox && addButton) {
|
||
|
|
if (checkbox.checked) {
|
||
|
|
addButton.classList.remove('hidden');
|
||
|
|
} else {
|
||
|
|
addButton.classList.add('hidden');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 添加生日优惠券
|
||
|
|
function addBirthdayCoupon(index) {
|
||
|
|
// 显示弹窗
|
||
|
|
const modal = document.getElementById('coupon-modal');
|
||
|
|
if (modal) {
|
||
|
|
modal.classList.remove('hidden');
|
||
|
|
resetCouponForm();
|
||
|
|
console.log('显示添加生日优惠券弹窗,等级索引:', index);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 关闭优惠券弹窗
|
||
|
|
function closeCouponModal(event) {
|
||
|
|
// 如果点击的是弹窗背景,则关闭弹窗
|
||
|
|
if (event && event.target !== event.currentTarget) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const modal = document.getElementById('coupon-modal');
|
||
|
|
if (modal) {
|
||
|
|
modal.classList.add('hidden');
|
||
|
|
console.log('关闭优惠券弹窗');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 重置优惠券表单
|
||
|
|
function resetCouponForm() {
|
||
|
|
const form = document.getElementById('coupon-form');
|
||
|
|
if (form) {
|
||
|
|
// 重置为默认值
|
||
|
|
document.getElementById('coupon-name').value = '生日优惠券';
|
||
|
|
document.getElementById('coupon-threshold').value = '10';
|
||
|
|
document.getElementById('coupon-discount').value = '1';
|
||
|
|
document.getElementById('coupon-validity').value = '1';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 调整门槛金额
|
||
|
|
function adjustThreshold(delta) {
|
||
|
|
const input = document.getElementById('coupon-threshold');
|
||
|
|
if (input) {
|
||
|
|
const currentValue = parseInt(input.value) || 0;
|
||
|
|
const newValue = Math.max(0, currentValue + delta);
|
||
|
|
input.value = newValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 调整减免金额
|
||
|
|
function adjustDiscount(delta) {
|
||
|
|
const input = document.getElementById('coupon-discount');
|
||
|
|
if (input) {
|
||
|
|
const currentValue = parseInt(input.value) || 0;
|
||
|
|
const newValue = Math.max(0, currentValue + delta);
|
||
|
|
input.value = newValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 提交优惠券
|
||
|
|
function submitCoupon() {
|
||
|
|
const form = document.getElementById('coupon-form');
|
||
|
|
if (!form) return;
|
||
|
|
|
||
|
|
// 获取表单数据
|
||
|
|
const couponData = {
|
||
|
|
name: document.getElementById('coupon-name').value,
|
||
|
|
threshold: document.getElementById('coupon-threshold').value,
|
||
|
|
discount: document.getElementById('coupon-discount').value,
|
||
|
|
validity: document.getElementById('coupon-validity').value
|
||
|
|
};
|
||
|
|
|
||
|
|
// 验证表单
|
||
|
|
if (!couponData.name.trim()) {
|
||
|
|
showNotification('请输入优惠券名称', 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!couponData.threshold || couponData.threshold < 0) {
|
||
|
|
showNotification('请输入有效的门槛金额', 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!couponData.discount || couponData.discount < 0) {
|
||
|
|
showNotification('请输入有效的减免金额', 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parseInt(couponData.discount) >= parseInt(couponData.threshold)) {
|
||
|
|
showNotification('减免金额不能大于或等于门槛金额', 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 提交成功
|
||
|
|
console.log('提交优惠券数据:', couponData);
|
||
|
|
showNotification(`成功添加优惠券:${couponData.name}`, 'success');
|
||
|
|
|
||
|
|
// 关闭弹窗
|
||
|
|
closeCouponModal();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 删除等级行
|
||
|
|
function deleteLevel(index) {
|
||
|
|
if (currentLevels.length <= 1) {
|
||
|
|
showNotification('至少需要保留一个等级', 'warning');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
currentLevels.splice(index, 1);
|
||
|
|
|
||
|
|
// 重新编号等级
|
||
|
|
currentLevels.forEach((level, i) => {
|
||
|
|
level.level = `LV${i + 1}`;
|
||
|
|
});
|
||
|
|
|
||
|
|
renderLevelEditTable();
|
||
|
|
showNotification(`删除等级 ${index + 1}`, 'success');
|
||
|
|
console.log('删除等级:', index);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 添加新等级
|
||
|
|
function addNewLevel() {
|
||
|
|
const newLevelNum = currentLevels.length + 1;
|
||
|
|
const lastLevel = currentLevels[currentLevels.length - 1];
|
||
|
|
|
||
|
|
const newLevel = {
|
||
|
|
level: `LV${newLevelNum}`,
|
||
|
|
name: `${getLevelName(newLevelNum)}会员`,
|
||
|
|
growthMin: lastLevel.growthMax + 1,
|
||
|
|
growthMax: lastLevel.growthMax + 1000,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: Math.min(lastLevel.discountRate + 5, 50),
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
};
|
||
|
|
|
||
|
|
currentLevels.push(newLevel);
|
||
|
|
renderLevelEditTable();
|
||
|
|
showNotification(`添加新等级 LV${newLevelNum}`, 'success');
|
||
|
|
console.log('添加新等级:', newLevel);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取等级名称
|
||
|
|
function getLevelName(levelNum) {
|
||
|
|
const names = ['铜牌', '银牌', '金牌', '钻石', '黑钻', '至尊', '王者', '传奇'];
|
||
|
|
return names[levelNum - 1] || `LV${levelNum}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 提交等级编辑
|
||
|
|
function submitLevelEdit() {
|
||
|
|
showNotification(`${currentShopName} 等级编辑已提交`, 'success');
|
||
|
|
console.log('提交等级编辑:', currentShopName);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 导出函数
|
||
|
|
window.toggleDiscountRate = toggleDiscountRate;
|
||
|
|
window.toggleCouponButton = toggleCouponButton;
|
||
|
|
window.addBirthdayCoupon = addBirthdayCoupon;
|
||
|
|
window.closeCouponModal = closeCouponModal;
|
||
|
|
window.resetCouponForm = resetCouponForm;
|
||
|
|
window.adjustThreshold = adjustThreshold;
|
||
|
|
window.adjustDiscount = adjustDiscount;
|
||
|
|
window.addCouponThreshold = addCouponThreshold;
|
||
|
|
window.submitCoupon = submitCoupon;
|
||
|
|
window.deleteLevel = deleteLevel;
|
||
|
|
window.addNewLevel = addNewLevel;
|
||
|
|
window.submitLevelEdit = submitLevelEdit;
|