docs: annotate remaining routes layouts and view boundaries

This commit is contained in:
cieanyau committed 2026-11-06 00:34:17 +08:00
1 parent 408f8e5c98
commit ab22d406c0
56 files changed
+403

No files matched your search

+8
View File
@@ -1,4 +1,7 @@
<script>
/**
* 商品详情/购物车编辑入口:校验商品与编辑位置,按服务端模块选择配置器;下单结果交给公共支付弹窗处理。
*/
import "~/assets/styles/MfDcimConfig.BhC_eZ0V.css";
import "~/assets/styles/MfCloudConfig.DbgUu8qr.css";
import "~/assets/styles/KkyEcsConfig.BFaAwQPZ.css";
@@ -86,6 +89,7 @@ var j = {
composables_t({
key: (e) => e.fullPath,
});
// 返回商品目录时仅保留有效的一、二级分类 ID,避免携带任意查询值。
function V() {
let e = {},
t = b.query.g ?? b.query.first_group_id,
@@ -123,6 +127,7 @@ var j = {
onScopeDispose(() => {
Z++;
});
// 依次确认商品可售、购物车位置仍匹配、模块可用;请求序号防止旧详情或描述覆盖新页面。
async function Q() {
let e = ++Z;
((W.value = !0), (G.value = ``), (H.value = null), (U.value = null));
@@ -164,14 +169,17 @@ var j = {
e === Z && (W.value = !1);
}
}
// 接收配置器返回的订单 ID 与金额,打开支付而不在此页重新创建订单。
function $(e) {
((Y.value = e.order_id), (X.value = e.amount), (J.value = !0));
}
// 支付完成后进入订单列表,后续状态由订单页确认。
function se() {
I.push(`/orders`);
}
return (
onMounted(Q),
// 商品模块决定实际配置组件;加载、不可售和模块错误先显示提示,配置器返回订单后才打开支付。
(t, n) => {
let i = NuxtLink,
o = ConfigLoadingShell,
+11
View File
@@ -1,4 +1,7 @@
<script>
/**
* 云服务器订购:先筛出云服务分类,再按分页商品选择对应模块配置器;分类和商品详情各用独立代次处理快速切换。
*/
import "~/assets/styles/MfCloudConfig.DbgUu8qr.css";
import "~/assets/styles/KkyEcsConfig.BFaAwQPZ.css";
import "~/assets/styles/ConfigResourceOption.Dj4VopnA.css";
@@ -135,6 +138,7 @@ var ge = {
Number(e.hidden ?? 0) !== 1 &&
(e.product_group_id_second == null ||
Number(e.product_group_id_second) === T.value);
// 只选择当前分组内且有库存的商品;读取详情后再次核验分组/库存并解析可用模块,再挂载配置器。
async function K(e) {
let t = E.value.find((t) => t.id === e);
if (
@@ -180,6 +184,7 @@ var ge = {
n === z && (j.value = !1);
}
}
// 切换分组或分页时清空旧配置,加载商品后优先选择查询指定或首个可售商品。
async function q() {
let e = ++R;
(z++,
@@ -215,6 +220,7 @@ var ge = {
e === R && (A.value = !1);
}
}
// 重新读取两级分类,并按标准化的云产品分类名筛选可用线路。
async function J() {
let e = ++R;
(z++,
@@ -255,20 +261,24 @@ var ge = {
e === R && (k.value = !1);
}
}
// 仅允许选择当前分类列表中存在的分组,并从第一页重新加载。
function xe(e) {
T.value !== e &&
w.value.some((t) => t.id === e) &&
((T.value = e), (L.value = 1), q());
}
// 商品分页变化时重载列表,旧配置器随之失效。
function Se(e) {
((L.value = e.page + 1), q());
}
let Y = ref(!1),
X = ref(null),
Z = ref(``);
// 配置器下单后记录返回订单并打开支付。
function Ce(e) {
((X.value = e.order_id), (Z.value = e.amount), (Y.value = !0));
}
// 支付完成进入该订单的结果页,真实付款状态仍由服务端返回。
function we() {
((Y.value = !1),
X.value && ve.push(`/orders/order/paid?id=${X.value}`));
@@ -296,6 +306,7 @@ var ge = {
};
return (
onMounted(J),
// 选择器与模块配置器使用同一商品快照;快速切换时由版本和组件 key 阻止旧配置继续提交。
(t, r) => {
let a = CloudProductPicker,
l = button,
@@ -1,4 +1,7 @@
<script>
/**
* 物理服务器定制入口:只接受有效商品 ID 且模块为 mf_dcim/remf_dcim,避免把其他类型商品交给物理服务器配置器。
*/
import "~/assets/styles/dedicated-server.CiJfMYtk.css";
import "~/assets/styles/ConfigDiskCard.Dx9IqqQ_.css";
import "~/assets/styles/PromoCodeField.qFEkB6Hm.css";
@@ -76,6 +79,7 @@ var A = {
onScopeDispose(() => {
U++;
});
// 重新读取商品并解析实际模块;页面离开时提升序号,描述异步补全也必须匹配当前请求。
async function W() {
let e = ++U,
t = I.value;
@@ -105,6 +109,7 @@ var A = {
e === U && (R.value = !1);
}
}
// 使用配置器返回的订单信息打开支付,不重复下单。
function G(e) {
((V.value = e.order_id), (H.value = e.amount), (B.value = !0));
}
@@ -112,6 +117,7 @@ var A = {
onMounted(() => {
I.value ? W() : (R.value = !1);
}),
// 只有已验证的物理商品挂载 MfDcimConfig,付款使用配置器返回订单而非再次下单。
(t, n) => {
let i = NuxtLink,
s = skeleton,
@@ -1,4 +1,7 @@
<script>
/**
* 物理服务器选型:汇总可售物理商品、机型与地区线路,支持规格/价格筛选,选择线路后进入独立定制页。
*/
import "~/assets/styles/dedicated-server.CiJfMYtk.css";
import { toDisplayString } from "vue";
import { renderList } from "vue";
@@ -29,6 +32,7 @@ import { n as product_name_n } from "~/lib/product-name.js";
import inputnumber from "primevue/inputnumber";
import tag from "primevue/tag";
import skeleton from "primevue/skeleton";
// 只识别本地或资源模块映射到 mf_dcim 的物理商品;未知模块不强行套用配置器。
function O(e) {
let t = e.module?.trim() || ``;
return t === `mf_dcim` || t === `remf_dcim`
@@ -37,6 +41,7 @@ function O(e) {
? `remf_dcim`
: void 0;
}
// 封装选型数据、筛选和线路详情,列表请求与选中线路请求使用独立序号。
function k() {
let e = useApi(),
t = ref(!0),
@@ -103,6 +108,7 @@ function k() {
onBeforeUnmount(() => {
((S = !0), y++, b++);
});
// 只清除筛选草稿,不修改服务端商品。
function C() {
Object.assign(p, {
minPrice: null,
@@ -114,6 +120,7 @@ function k() {
disk: ``,
});
}
// 商品库存与自动同步的机型库存都满足时才允许选购。
function w(e) {
return (
!(e.product.stock_control === 1 && Number(e.product.qty) <= 0) &&
@@ -124,6 +131,7 @@ function k() {
)
);
}
// 分页收集商品后并行加载物理模块配置;单个商品失败保留其余可用项并提示部分加载失败。
async function T() {
let a = ++y;
(b++,
@@ -200,6 +208,7 @@ function k() {
!S && a === y && (t.value = !1);
}
}
// 按当前机型读取各线路详情,快速改选时只接纳最新选择的结果。
async function E(t) {
o.value = m(t);
let n = ++b;
@@ -219,6 +228,7 @@ function k() {
(l.value = !1));
}
}
// 关闭机型选择并使尚未完成的线路请求失效。
function D() {
(b++, (o.value = ``), (c.value = {}), (l.value = !1), (f.value = ``));
}
@@ -382,16 +392,19 @@ var te = {
label: `硬盘`,
},
];
// 只有明确有效的商品价格才显示金额,缺失时提示配置后确认。
function xe(e) {
return e !== void 0 && e.trim() !== `` && Number.isFinite(Number(e))
? `¥ ${Number(e).toFixed(2)}`
: `价格待配置`;
}
// 定制链接携带当前商品、机型及所选线路 ID,最终仍由配置页加载并验证商品。
function Se(e) {
return `/products/dedicated-server/customize?id=${C.value?.product.id}&model_id=${C.value?.model.id}&line_id=${e}`;
}
return (
onMounted(s.load),
// 机型筛选卡、线路详情和定制入口共享当前选择;部分配置读取失败有单独反馈,不伪装成无库存。
(n, r) => {
let a = NuxtLink,
k = inputnumber,
+27
View File
@@ -1,4 +1,7 @@
<script>
/**
* 商品目录:两级分类、搜索、分页和配置摘要;摘要缓存按账户令牌与 API origin 分区,切换会话后清理,不能跨账号复用。
*/
import "~/assets/styles/ProductGroupLabel.B1kWpFA-.css";
import "~/assets/styles/ProductDescription.Ctb7jDuO.css";
import "~/assets/styles/ProductConfigurationSummary.BqZns1LB.css";
@@ -53,6 +56,7 @@ var j = rolldown_runtime_i(getCrypto(), 1),
N = 100,
P = 512e3,
F = 3;
// 校验本地摘要缓存键的结构、字段长度和规范序列化,拒绝不符合当前格式的存储条目。
function I(e) {
if (typeof e != `string` || e.length > 4096) return !1;
try {
@@ -73,6 +77,7 @@ function I(e) {
return !1;
}
}
// 摘要仅接受有界、非空的字符串数组,不从本地存储信任任意结构。
function L(e) {
return (
Array.isArray(e) &&
@@ -83,6 +88,7 @@ function L(e) {
)
);
}
// 管理摘要缓存、过期清理和同键在途请求复用;持久化容量有界,清空操作会使旧异步任务失效。
function R(e, t = Date.now, n) {
let r = new Map(),
i = new Map(),
@@ -226,6 +232,7 @@ function R(e, t = Date.now, n) {
};
}
var z = new WeakMap();
// 为当前 Pinia 会话建立缓存管理;每次读取确认 localStorage 令牌一致,并按后端 origin 隔离数据。
function pe() {
let e = useAuth(),
n = useRuntimeConfig(),
@@ -291,6 +298,7 @@ function pe() {
clear: () => B(a),
};
}
// 提升缓存版本并清除各分区及持久化内容,使旧账号的在途摘要结果不能写回。
function B(e) {
e.version++;
for (let t of e.caches.values()) t.clear();
@@ -405,6 +413,7 @@ var me = {
onScopeDispose(() => {
(W++, G++);
});
// 部分物理模块列表无可靠起价,需要后续从套餐配置补充,不直接把无效零价当报价。
function q(e) {
let t = Number(e.price);
return (
@@ -413,6 +422,7 @@ var me = {
(!Number.isFinite(t) || t <= 0)
);
}
// 列出有效父分类与子分类配对,供未指定分类时逐一寻找可展示商品。
function Re() {
return I.value.flatMap((e) =>
L.value
@@ -423,11 +433,13 @@ var me = {
})),
);
}
// 分类查询参数只接受正的安全整数,避免错误编号进入目录状态。
function J(e) {
if (typeof e != `string` || !/^[1-9]\d*$/.test(e)) return null;
let t = Number(e);
return Number.isSafeInteger(t) ? t : null;
}
// 依据实际分类树恢复查询选择,子分类必须属于有效父分类;无效组合不直接套用。
function ze() {
let e = J(o.query.g) ?? J(o.query.first_group_id),
t = J(o.query.sg) ?? J(o.query.second_group_id),
@@ -456,6 +468,7 @@ var me = {
}
return null;
}
// 把分类选择规范为 g/sg 查询参数,去掉旧参数别名并保留其他查询。
function Y(e, t) {
let n = {
...o.query,
@@ -473,6 +486,7 @@ var me = {
query: n,
}));
}
// 未指定有效分类时依次查找非空分类;全部为空则回到首个分类展示真实空态。
async function Be(e) {
let t = Re(),
n = t[0];
@@ -502,6 +516,7 @@ var me = {
(j.value = ``),
(D.value = !1));
}
// 重新加载两级分类后恢复有效选择与页码;分类已变更时重新选择,不沿用过期商品列表。
async function X() {
let e = ++G;
(W++, (B.value = !0), (D.value = !0), (V.value = ``), (j.value = ``));
@@ -547,6 +562,7 @@ var me = {
e === G && (B.value = !1);
}
}
// 切换一级分类时选择其首个子分类,重置分页并同步 URL。
function Ve(e) {
if (
!B.value &&
@@ -561,6 +577,7 @@ var me = {
Z()
);
}
// 只允许切换当前一级分类下存在的二级分类。
function He(e) {
if (
!B.value &&
@@ -569,6 +586,7 @@ var me = {
)
return ((z.value = e), (M.value = 1), Y(R.value, z.value), Z());
}
// 按当前分类/页码/搜索请求列表;仅同一查询复用现有摘要与起价,异步补全仍需匹配列表代次。
async function Z(e = !1) {
if (B.value || V.value) return;
let n = ++W;
@@ -644,16 +662,20 @@ var me = {
n === W && (D.value = !1);
}
}
// 搜索确认后应用关键词并回到第一页。
function Ue() {
return ((F.value = P.value.trim()), (M.value = 1), Z());
}
// 清空草稿关键词,再复用统一搜索提交逻辑。
function We() {
return ((P.value = ``), Ue());
}
// 加载中或当前查询有错误时不接受分页,防止叠加新的列表状态。
function Ge(e) {
if (!(D.value || B.value || j.value || V.value))
return ((M.value = e.page + 1), (N.value = e.rows), Z());
}
// 把已知计费周期转换为中文单位,未知英文枚举不直接作为用户文案。
function Ke(e) {
return e
? {
@@ -667,11 +689,13 @@ var me = {
}[e] || (/[\u4e00-\u9fff]/.test(e) ? e : ``)
: ``;
}
// 仅在库存控制已开启且数量明确不大于零时判定售罄。
function Q(e) {
return (
Number(e.stock_control) === 1 && e.qty != null && Number(e.qty) <= 0
);
}
// 不允许订购标记或未知模块会阻止进入配置流程,不能单靠列表有价格就开放下单。
function $(e) {
let t = e.module?.trim();
return (
@@ -692,6 +716,7 @@ var me = {
].includes(t))
);
}
// 区别免费、有效起价、补价中、缺货及配置后报价,不把未知金额显示成零元。
function qe(e) {
if (e.pay_type === `free`) return `免费`;
let t = Number(e.price);
@@ -705,6 +730,7 @@ var me = {
? `暂无价格`
: `配置后报价`;
}
// 详情链接保留当前有效分类选择,返回目录时可恢复上下文。
function Je(e) {
return {
path: `/products/${e}`,
@@ -724,6 +750,7 @@ var me = {
}
return (
onMounted(X),
// 分类、商品列表、起价/摘要及库存状态分别呈现;配置摘要是辅助信息,最终报价仍在配置器中确认。
(e, t) => {
let i = NuxtLink,
o = skeleton,