docs: explain configuration inputs and authentication components
This commit is contained in:
1 parent
dc32a74d7a
commit
3a53d2e58f
19 files changed
+72
No files matched your search
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** 带宽输入/滑块:按后端 options 的合法区间和步长吸附,单位为 Mbps,固定带宽不可调。 */
|
||||
import "~/assets/styles/ConfigBandwidth.CWSH1WJZ.css";
|
||||
import { nextTick } from "vue";
|
||||
import { normalizeClass } from "vue";
|
||||
@@ -83,6 +84,7 @@ var p = {
|
||||
: `当前线路暂无可用带宽。`,
|
||||
);
|
||||
function T(e) {
|
||||
// 将任意输入映射到最近合法档位,并限制浮点小数精度,避免步长计算产生漂移。
|
||||
let t = b.value,
|
||||
n = 1 / 0;
|
||||
for (let r of y.value) {
|
||||
@@ -121,9 +123,11 @@ var p = {
|
||||
(D(Number(t.value), !1), (t.value = String(T(Number(t.value)))));
|
||||
}
|
||||
function k() {
|
||||
// E 记录滑块期间是否真正改值,松开后只触发一次报价重算。
|
||||
(E && !_.disabled && !S.value && v(`change`), (E = !1));
|
||||
}
|
||||
function A(e) {
|
||||
// Home/End 选边界,方向键与翻页键选择跨区间的相邻有效档位。
|
||||
if (_.disabled || S.value) return;
|
||||
if (e.key === `Home` || e.key === `End`) {
|
||||
(e.preventDefault(), D(e.key === `Home` ? b.value : x.value));
|
||||
@@ -156,6 +160,7 @@ var p = {
|
||||
r.length && D(t > 0 ? Math.min(...r) : Math.max(...r));
|
||||
}
|
||||
async function j(t) {
|
||||
// 等待组件内部事件结束,再把已归一化数值同步回输入框和读屏属性。
|
||||
(await Promise.resolve(), await nextTick());
|
||||
let n = t.originalEvent.target;
|
||||
((n.value = C.value === null ? `` : String(C.value)),
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
<script>
|
||||
/**
|
||||
* 配置页右侧结算摘要:父级负责报价和真正提交,本组件负责按钮状态、登录跳转及限购提示。
|
||||
* cart/buy/recalc/retry 是交给父级处理的意图事件;展示价格不是可直接信任的最终成交金额。
|
||||
*/
|
||||
import "~/assets/styles/PromoCodeField.qFEkB6Hm.css";
|
||||
import { toDisplayString } from "vue";
|
||||
import { renderList } from "vue";
|
||||
@@ -158,6 +162,7 @@ var O = {
|
||||
X = computed(() => Y.value && (!J.checked.value || !J.allowed.value)),
|
||||
Z;
|
||||
function Q() {
|
||||
// 编辑购物车需要携带 position;商品、数量或账号变化时重新验证对应购买场景。
|
||||
if (!Y.value) {
|
||||
J.reset();
|
||||
return;
|
||||
@@ -199,6 +204,7 @@ var O = {
|
||||
(Z?.(), J.reset());
|
||||
}));
|
||||
function $(e) {
|
||||
// 报价未就绪、请求进行中或限购未通过时均不触发提交;未登录保留当前配置页跳转目标。
|
||||
if (H.canSubmit && H.quoteReady && !H.priceLoading && !q.value) {
|
||||
if (!G.isLoggedIn)
|
||||
return navigateTo({
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** 通用配置单选卡片组:父级提供 options,点击新值同时发出 v-model 更新与 change。 */
|
||||
import "~/assets/styles/OsIcon.CAi4Iz2S.css";
|
||||
import { toDisplayString } from "vue";
|
||||
import { renderList } from "vue";
|
||||
@@ -38,6 +39,7 @@ var d = [`aria-label`],
|
||||
let h = c,
|
||||
g = m;
|
||||
function _(e) {
|
||||
// 禁用或重复点击当前选项均不触发重算,避免无效报价请求。
|
||||
h.disabled ||
|
||||
h.modelValue === e ||
|
||||
(g(`update:modelValue`, e), g(`change`));
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** 添加磁盘的展示入口;只发出 add 事件,磁盘上限、默认容量和价格由父级配置组件决定。 */
|
||||
import "~/assets/styles/ConfigDiskAdd.C92e9ZuF.css";
|
||||
import { toDisplayString } from "vue";
|
||||
import { createCommentVNode } from "vue";
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** 磁盘容量选择卡:options 定义离散值或步长区间,v-model 保存容量,change 通知父级重算报价。 */
|
||||
import "~/assets/styles/ConfigDiskCard.Dx9IqqQ_.css";
|
||||
import { nextTick } from "vue";
|
||||
import { toDisplayString } from "vue";
|
||||
@@ -96,6 +97,7 @@ var m = {
|
||||
: `容量 ${T.value}–${E.value} ${S.unit}`,
|
||||
);
|
||||
function A(e) {
|
||||
// 在所有有效区间中寻找最近合法档位,不能只按全局 min/max 截断后提交任意数值。
|
||||
let t = T.value,
|
||||
n = 1 / 0;
|
||||
for (let r of w.value) {
|
||||
@@ -127,6 +129,7 @@ var m = {
|
||||
(C(`update:modelValue`, n), t && C(`change`));
|
||||
}
|
||||
function M(e) {
|
||||
// 拖动时更新容量但不逐帧重算;结束交互由 N 单独发出 change。
|
||||
let t = e.target,
|
||||
n = Number(t.value);
|
||||
(j(n, !1), (t.value = String(A(n))));
|
||||
@@ -135,6 +138,7 @@ var m = {
|
||||
!S.disabled && !D.value && C(`change`);
|
||||
}
|
||||
function P(e) {
|
||||
// 方向键跨区间寻找下一合法档位,避免跨越不允许购买的容量空档。
|
||||
let t = [`ArrowRight`, `ArrowUp`].includes(e.key)
|
||||
? 1
|
||||
: [`ArrowLeft`, `ArrowDown`].includes(e.key)
|
||||
@@ -165,6 +169,7 @@ var m = {
|
||||
!S.disabled && S.removable && C(`remove`);
|
||||
}
|
||||
async function I(t) {
|
||||
// PrimeVue 完成内部输入更新后再同步合法值与 aria 状态,避免显示值和实际容量不一致。
|
||||
(await Promise.resolve(), await nextTick());
|
||||
let n = t.originalEvent.target;
|
||||
((n.value = String(O.value)),
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** 商品配置的占位骨架;busy 仅表示加载状态,真实配置/报价仍由对应产品组件负责。 */
|
||||
import { renderList } from "vue";
|
||||
import { renderSlot } from "vue";
|
||||
import { createElementBlock } from "vue";
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** CPU/内存等资源档位选择器:离散资源显示卡片,区间资源显示范围选择和数值输入。 */
|
||||
import "~/assets/styles/OsIcon.CAi4Iz2S.css";
|
||||
import "~/assets/styles/ConfigResourceOption.Dj4VopnA.css";
|
||||
import { toDisplayString } from "vue";
|
||||
@@ -91,6 +92,7 @@ var h = {
|
||||
: Number(_.modelValue),
|
||||
);
|
||||
function C(e) {
|
||||
// 在当前区间按步长吸附,并将最大值收敛到实际可达档位后再通知父级。
|
||||
if (_.disabled || e === null || !Number.isFinite(e) || !x.value)
|
||||
return;
|
||||
let { min: t, max: n, step: r } = x.value,
|
||||
@@ -105,6 +107,7 @@ var h = {
|
||||
(v(`update:modelValue`, a), v(`change`));
|
||||
}
|
||||
function w(e) {
|
||||
// 选择新的范围时使用该范围最小值;当前值仍属于同一合法档位时不重复发事件。
|
||||
if (_.disabled) return;
|
||||
let t = y.value.find((t) => t.value === e);
|
||||
if (!t) return;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** 按商品 fields 渲染订购信息;explain 只读,其他字段按 id 写入父级 modelValue。 */
|
||||
import "~/assets/styles/ProductCustomFields.B2QMnPil.css";
|
||||
import { toDisplayString } from "vue";
|
||||
import { renderList } from "vue";
|
||||
@@ -46,6 +47,7 @@ var _ = {
|
||||
S = f,
|
||||
C = computed(() => x.fields.filter((e) => e.kind !== `explain`));
|
||||
function w(e, t) {
|
||||
// 后端自定义字段采用字符串值;复制对象更新,不能直接修改父级传入的对象。
|
||||
S(`update:modelValue`, {
|
||||
...x.modelValue,
|
||||
[e]: t == null ? `` : String(t),
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script>
|
||||
/** 优惠码输入框:提交后更新 v-model 并请求父级 recalc,不在组件内自行计算折扣。 */
|
||||
import "~/assets/styles/PromoCodeField.qFEkB6Hm.css";
|
||||
import { toDisplayString } from "vue";
|
||||
import { normalizeClass } from "vue";
|
||||
@@ -53,6 +54,7 @@ var y = [`open`],
|
||||
w = ref(!1),
|
||||
T = ref(`idle`);
|
||||
function E() {
|
||||
// 仅提交去空白的非空优惠码,w 用于把下一轮报价结束关联到本次应用动作。
|
||||
if (x.disabled || x.loading) return;
|
||||
let e = C.value.trim();
|
||||
e &&
|
||||
@@ -69,6 +71,7 @@ var y = [`open`],
|
||||
}
|
||||
return (
|
||||
watch(
|
||||
// 等父级 loading 从真变假后,根据实际折扣判断成功或无效,不把发事件当验证成功。
|
||||
() => x.loading,
|
||||
(e, t) => {
|
||||
t &&
|
||||
|
||||
Reference in new issue
Block a user