263 lines
12 KiB
JavaScript
263 lines
12 KiB
JavaScript
import { V as ElCol, T as ElCard, a3 as ElDescriptions, a4 as ElDescriptionsItem, h as ElButton, ao as vLoading, w as ElForm, x as ElFormItem, av as ElInputNumber, M as ElSwitch, a0 as ElAlert, U as ElRow, E as ElMessage } from "./element-plus.CkEW9frc.js";
|
|
import { Y as YifanMembershipAPI } from "./yifan_membership.CCYhkrJx.js";
|
|
import { J as defineComponent, t as onMounted, S as openBlock, _ as createElementBlock, $ as createVNode, a0 as withCtx, a6 as withDirectives, T as createBlock, a9 as createTextVNode, aa as toDisplayString, a1 as createBaseVNode, r as ref, ak as reactive, j as computed } from "./.pnpm.BW3P1y8f.js";
|
|
import { _ as _export_sfc } from "./_plugin-vue_export-helper.1tPrXgE0.js";
|
|
import "./index.CMd5bD1r.js";
|
|
import "./codemirror.CvJAcn2d.js";
|
|
const _hoisted_1 = { class: "app-container" };
|
|
const _hoisted_2 = { class: "mt-4" };
|
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
...{
|
|
name: "YifanMembershipUserCenter",
|
|
inheritAttrs: false
|
|
},
|
|
__name: "index",
|
|
setup(__props) {
|
|
const benefitsLoading = ref(false);
|
|
const detectLoading = ref(false);
|
|
const levelTextMap = {
|
|
junior: "初级会员",
|
|
senior: "高级会员"
|
|
};
|
|
const benefits = reactive({
|
|
member_level: "junior",
|
|
free_rename_quota: 0,
|
|
daily_detect_remaining: 0,
|
|
discount_rate: 1
|
|
});
|
|
const renameForm = reactive({
|
|
original_price: 0,
|
|
use_free_quota: true,
|
|
free_quota: 0,
|
|
discount_rate: 1
|
|
});
|
|
function toNumber(value, fallback = 0) {
|
|
const num = Number(value);
|
|
return Number.isNaN(num) ? fallback : num;
|
|
}
|
|
function toRate(value, fallback = 1) {
|
|
const num = toNumber(value, fallback);
|
|
return Math.min(1, Math.max(0, Number(num.toFixed(2))));
|
|
}
|
|
function toPercent(value) {
|
|
return `${(toRate(value) * 100).toFixed(2)}%`;
|
|
}
|
|
const displayPrice = computed(() => {
|
|
const originalPrice = Number(toNumber(renameForm.original_price, 0).toFixed(2));
|
|
const canUseFree = renameForm.use_free_quota && toNumber(renameForm.free_quota, 0) > 0;
|
|
const finalPrice = canUseFree ? 0 : Number((originalPrice * toRate(renameForm.discount_rate, 1)).toFixed(2));
|
|
return {
|
|
originalPrice: originalPrice.toFixed(2),
|
|
finalPrice: finalPrice.toFixed(2),
|
|
freeTag: canUseFree ? "本次使用免费名额" : "本次未使用免费名额"
|
|
};
|
|
});
|
|
async function loadBenefits() {
|
|
benefitsLoading.value = true;
|
|
try {
|
|
const response = await YifanMembershipAPI.getMyBenefits();
|
|
const data = response.data.data;
|
|
benefits.member_level = data.member_level || "junior";
|
|
benefits.free_rename_quota = toNumber(data.free_rename_quota, 0);
|
|
benefits.daily_detect_remaining = toNumber(data.daily_detect_remaining, 0);
|
|
benefits.discount_rate = toRate(data.discount_rate, 1);
|
|
renameForm.discount_rate = benefits.discount_rate;
|
|
renameForm.free_quota = benefits.free_rename_quota;
|
|
} catch (error) {
|
|
ElMessage.error((error == null ? void 0 : error.message) || "会员权益加载失败");
|
|
} finally {
|
|
benefitsLoading.value = false;
|
|
}
|
|
}
|
|
async function handleConsumeDailyDetect() {
|
|
detectLoading.value = true;
|
|
try {
|
|
await YifanMembershipAPI.consumeDailyDetect();
|
|
await loadBenefits();
|
|
} catch (error) {
|
|
const msg = (error == null ? void 0 : error.message) || "检测次数扣减失败";
|
|
if (msg.includes("今日免费检测次数已用完")) {
|
|
ElMessage.warning("今日免费检测次数已用完,请明日再试或使用付费/会员能力");
|
|
} else {
|
|
ElMessage.error(msg);
|
|
}
|
|
} finally {
|
|
detectLoading.value = false;
|
|
}
|
|
}
|
|
onMounted(() => {
|
|
loadBenefits();
|
|
});
|
|
return (_ctx, _cache) => {
|
|
const _component_el_descriptions_item = ElDescriptionsItem;
|
|
const _component_el_descriptions = ElDescriptions;
|
|
const _component_el_button = ElButton;
|
|
const _component_el_card = ElCard;
|
|
const _component_el_col = ElCol;
|
|
const _component_el_input_number = ElInputNumber;
|
|
const _component_el_form_item = ElFormItem;
|
|
const _component_el_switch = ElSwitch;
|
|
const _component_el_form = ElForm;
|
|
const _component_el_alert = ElAlert;
|
|
const _component_el_row = ElRow;
|
|
const _directive_loading = vLoading;
|
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
createVNode(_component_el_row, { gutter: 16 }, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_col, {
|
|
xs: 24,
|
|
lg: 10
|
|
}, {
|
|
default: withCtx(() => [
|
|
withDirectives((openBlock(), createBlock(_component_el_card, null, {
|
|
header: withCtx(() => [..._cache[4] || (_cache[4] = [
|
|
createBaseVNode("div", { class: "card-header" }, "个人中心 - 会员权益", -1)
|
|
])]),
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_descriptions, {
|
|
column: 1,
|
|
border: ""
|
|
}, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_descriptions_item, { label: "会员等级" }, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(levelTextMap[benefits.member_level] || benefits.member_level), 1)
|
|
]),
|
|
_: 1
|
|
}),
|
|
createVNode(_component_el_descriptions_item, { label: "免费改名名额" }, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(benefits.free_rename_quota), 1)
|
|
]),
|
|
_: 1
|
|
}),
|
|
createVNode(_component_el_descriptions_item, { label: "今日检测剩余次数" }, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(benefits.daily_detect_remaining), 1)
|
|
]),
|
|
_: 1
|
|
}),
|
|
createVNode(_component_el_descriptions_item, { label: "会员折扣" }, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(toPercent(benefits.discount_rate)), 1)
|
|
]),
|
|
_: 1
|
|
})
|
|
]),
|
|
_: 1
|
|
}),
|
|
createBaseVNode("div", _hoisted_2, [
|
|
createVNode(_component_el_button, {
|
|
type: "primary",
|
|
loading: detectLoading.value,
|
|
onClick: handleConsumeDailyDetect
|
|
}, {
|
|
default: withCtx(() => [..._cache[5] || (_cache[5] = [
|
|
createTextVNode(" 使用一次每日检测 ", -1)
|
|
])]),
|
|
_: 1
|
|
}, 8, ["loading"]),
|
|
_cache[6] || (_cache[6] = createBaseVNode("div", { class: "hint-text mt-2" }, " 若提示“今日免费检测次数已用完”,请明日再试或引导用户付费/开通会员。 ", -1))
|
|
])
|
|
]),
|
|
_: 1
|
|
})), [
|
|
[_directive_loading, benefitsLoading.value]
|
|
])
|
|
]),
|
|
_: 1
|
|
}),
|
|
createVNode(_component_el_col, {
|
|
xs: 24,
|
|
lg: 14
|
|
}, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_card, null, {
|
|
header: withCtx(() => [..._cache[7] || (_cache[7] = [
|
|
createBaseVNode("div", { class: "card-header" }, "改名下单价格展示(前端)", -1)
|
|
])]),
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_form, {
|
|
model: renameForm,
|
|
"label-width": "120px",
|
|
"label-suffix": ":"
|
|
}, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_form_item, { label: "原价 original_price" }, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_input_number, {
|
|
modelValue: renameForm.original_price,
|
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => renameForm.original_price = $event),
|
|
min: 0,
|
|
step: 1,
|
|
precision: 2
|
|
}, null, 8, ["modelValue"])
|
|
]),
|
|
_: 1
|
|
}),
|
|
createVNode(_component_el_form_item, { label: "是否使用免费名额" }, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_switch, {
|
|
modelValue: renameForm.use_free_quota,
|
|
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => renameForm.use_free_quota = $event)
|
|
}, null, 8, ["modelValue"])
|
|
]),
|
|
_: 1
|
|
}),
|
|
createVNode(_component_el_form_item, { label: "免费名额剩余" }, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_input_number, {
|
|
modelValue: renameForm.free_quota,
|
|
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => renameForm.free_quota = $event),
|
|
min: 0,
|
|
step: 1,
|
|
precision: 0
|
|
}, null, 8, ["modelValue"])
|
|
]),
|
|
_: 1
|
|
}),
|
|
createVNode(_component_el_form_item, { label: "会员折扣" }, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_el_input_number, {
|
|
modelValue: renameForm.discount_rate,
|
|
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => renameForm.discount_rate = $event),
|
|
min: 0,
|
|
max: 1,
|
|
step: 0.01,
|
|
precision: 2
|
|
}, null, 8, ["modelValue"])
|
|
]),
|
|
_: 1
|
|
})
|
|
]),
|
|
_: 1
|
|
}, 8, ["model"]),
|
|
createVNode(_component_el_alert, {
|
|
type: "info",
|
|
closable: false,
|
|
class: "mb-3"
|
|
}, {
|
|
title: withCtx(() => [
|
|
createTextVNode(" 展示建议:原价 " + toDisplayString(displayPrice.value.originalPrice) + " 元,折后价 " + toDisplayString(displayPrice.value.finalPrice) + " 元, " + toDisplayString(displayPrice.value.freeTag), 1)
|
|
]),
|
|
_: 1
|
|
}),
|
|
_cache[8] || (_cache[8] = createBaseVNode("div", { class: "hint-text" }, " 下单请求参数请携带 `original_price`,后端会自动优先扣免费名额,不足时按会员折扣计算并写消费记录。 ", -1))
|
|
]),
|
|
_: 1
|
|
})
|
|
]),
|
|
_: 1
|
|
})
|
|
]),
|
|
_: 1
|
|
})
|
|
]);
|
|
};
|
|
}
|
|
});
|
|
const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7b627a0e"]]);
|
|
export {
|
|
index as default
|
|
};
|