docs: align shared-module comments with actual edge cases
This commit is contained in:
1 parent
3af9eddd3f
commit
deb7c3b3cd
14 files changed
+20
-19
No files matched your search
+4
-3
@@ -1,7 +1,8 @@
|
||||
/**
|
||||
* 控制台统一请求与登录会话入口。
|
||||
* 页面通过 useApi 访问 /console/v1,通过 useAuth 共享登录状态;本模块只在客户端使用。
|
||||
* 后端业务成功必须同时满足 HTTP 成功和响应信封 status === 200,不能仅检查 HTTP 状态。
|
||||
* 默认 JSON 请求须同时满足 HTTP 成功和信封 status === 200;显式兼容项可接受无 status 的 data 数组。
|
||||
* 文件下载使用独立响应规则,不能把默认 JSON 信封要求直接套用于文件内容。
|
||||
*/
|
||||
import CryptoJS from "crypto-js";
|
||||
import { defineStore } from "pinia";
|
||||
@@ -71,7 +72,7 @@ function _e() {
|
||||
function ve() {
|
||||
return ge;
|
||||
}
|
||||
/** 按身份/命名空间、接口及参数生成稳定键;对象键排序避免同义参数重复缓存。 */
|
||||
/** 按接口、命名空间与参数生成稳定键;对象键排序,身份隔离由缓存读写单独处理。 */
|
||||
function ye(e, t, n = ``) {
|
||||
return JSON.stringify([e, n, t], (e, t) =>
|
||||
t && typeof t == `object` && !Array.isArray(t)
|
||||
@@ -685,7 +686,7 @@ const useAuth = defineStore("auth", () => {
|
||||
let sessionVersion = 0;
|
||||
let legacySession = null;
|
||||
|
||||
// 仅在登录或服务端核验成功后调用;先清理上一会话的缓存与未完成旧平台登录。
|
||||
// 接收登录、旧入口核验或跨标签同步的凭证;先清理旧缓存和未完成的旧平台登录。
|
||||
function loginWithJwt(jwt) {
|
||||
if (!ut(jwt))
|
||||
throw Error("登录响应无效,请重新登录;若持续失败,请联系客服。");
|
||||
|
||||
@@ -41,7 +41,7 @@ function e(e) {
|
||||
}
|
||||
return r(e);
|
||||
}
|
||||
/** 路径长度和匹配 query 数量决定激活优先级,避免父菜单与更具体子菜单同时高亮。 */
|
||||
/** 路径长度和匹配 query 数量决定激活优先级,在传入候选项中优先匹配更具体的菜单。 */
|
||||
function t(e, t, n = []) {
|
||||
let r =
|
||||
t.path === `/products/cvm`
|
||||
@@ -278,7 +278,7 @@ function d(e) {
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 规范化后端菜单树:最多三层、每层最多 100 项,文本最多 100 字。
|
||||
* 规范化后端菜单树:深度最多三层,每组同级菜单最多 100 项,标签截取前 100 个字符。
|
||||
* 无法适配的菜单保留禁用原因而非猜测跳转;二次提醒 second_reminder 作为确认标记保留。
|
||||
*/
|
||||
function f(e, t = ``, a = 0) {
|
||||
|
||||
@@ -76,7 +76,7 @@ async function l(e) {
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 返回编辑保存函数:n 为 API 客户端,r 包含 position/item,u 回调检查报价是否仍有效。
|
||||
* n 为 API 客户端,r 包含 position/item;返回函数的第二参 u 检查报价是否仍有效。
|
||||
* 保存前重取购物车并比较原始项,提交 expected_item 供后端进一步检测并发变更。
|
||||
*/
|
||||
function u(n, r) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/** 云实例管理表单的协议校验:防御报价、订单、NAT、VPC 和磁盘规格。 */
|
||||
var e = (e) => e === `mf_cloud` || e === `remf_cloud`;
|
||||
// 空对象表示没有防御选项;非空配置必须给出合法的 defence 列表及当前防御值。
|
||||
// 空对象表示没有防御选项;非空配置须有合法 defence 列表,当前防御值可缺省,非空时须合法。
|
||||
function t(e) {
|
||||
let t = () => {
|
||||
throw Error(`防御配置无效,请重试`);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* 拉取完整关联列表:e(page, limit) 返回 {list, count?},t 判断调用上下文是否仍有效。
|
||||
* 按正整数 id 去重;总数缺失时以不足一页结束,无新增项时拒绝,避免无限分页。
|
||||
* 按正整数 id 去重;总数缺失时以不足一页结束,尚未满足结束条件却无新增项时拒绝。
|
||||
*/
|
||||
async function e(e, t = () => !0) {
|
||||
let n = [],
|
||||
|
||||
@@ -8,7 +8,7 @@ function e(e) {
|
||||
function t(e) {
|
||||
return e === `help` || e === `news` || e === `notices` ? e : null;
|
||||
}
|
||||
// 通过后端启用的插件记录确定类型;未知/停用插件不生成内容路由。
|
||||
// 通过插件记录确定类型;兼容缺省 status,明确停用或未知类型的插件不生成内容路由。
|
||||
function n(t, n) {
|
||||
let r = e(t);
|
||||
return r
|
||||
|
||||
+1
-1
@@ -80,7 +80,7 @@ var t = {
|
||||
function a(e) {
|
||||
return i[e] ?? e;
|
||||
}
|
||||
// 订单优先展示脱敏后的商品名列表,缺失时回落到订单名称/描述。
|
||||
// 订单优先展示移除内部 -L 后缀的商品名列表,缺失时回落到订单名称/描述。
|
||||
function o(t) {
|
||||
let n = t.product_names;
|
||||
if (Array.isArray(n)) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/** 多供应商实例数据展示适配;缺失/无效数值用 null 表示,避免误显示为有效的 0。 */
|
||||
/** 多供应商实例数据展示适配;基础数值以 null 区分缺值与 0,具体输出再按展示协议归一。 */
|
||||
function e(e) {
|
||||
if (e == null || e === ``) return null;
|
||||
let t = Number(e);
|
||||
|
||||
@@ -15,7 +15,7 @@ function e(e, t) {
|
||||
}[e.suspend_type || ``] ||
|
||||
`暂停原因暂未提供,请联系支持`;
|
||||
}
|
||||
// 业务状态优先于电源状态;只有 Active 实例才显示运行/关机等即时状态。
|
||||
// 明确的非 Active 业务状态优先;Active 或未提供业务状态时才读取运行/关机等即时状态。
|
||||
function t(e, t = `Active`, n = !1) {
|
||||
let r = {
|
||||
Unpaid: `未付款`,
|
||||
|
||||
@@ -195,7 +195,7 @@ function o(e) {
|
||||
e.filter((e) => e.kind !== `explain`).map((e) => [e.id, (e.kind, ``)]),
|
||||
);
|
||||
}
|
||||
/** 逐字段检查必填、选项值和可本地执行的正则;布尔字段按后端约定归一为 "1"/空串。 */
|
||||
/** 检查必填、选项和可本地执行的正则;校验时将布尔值视为 "1"/空串,不修改传入表单。 */
|
||||
function s(e, t) {
|
||||
for (let n of e) {
|
||||
if (n.kind === `explain`) continue;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 服务器列表分类适配:优先使用后端 classified-v1 分页,旧协议才完整拉取后在前端分类。
|
||||
* 服务器列表分类适配:优先使用 classified-v1 分页;旧协议或跨页自然排序时完整拉取。
|
||||
* 分类结果和请求只在当前工厂实例内缓存,invalidate 作废在途结果对应的代次。
|
||||
*/
|
||||
// 这些既有通用商品在当前业务中按独立服务器展示;变更须与商品配置约定一起核对。
|
||||
@@ -76,7 +76,7 @@ function n(e, n, r) {
|
||||
l.get(a) === o && l.delete(a);
|
||||
}
|
||||
}
|
||||
/** 旧协议完整加载列表并去重,最多四个并发详情请求补齐分类,再按目标模块筛选。 */
|
||||
/** 完整加载列表并去重;旧协议的通用商品最多四个并发详情请求补齐分类,再按模块筛选。 */
|
||||
async function _(n, o, c) {
|
||||
let l = [],
|
||||
u = {},
|
||||
@@ -223,7 +223,7 @@ function n(e, n, r) {
|
||||
Number(s.count) === s.list.length &&
|
||||
(a = s));
|
||||
}
|
||||
// 老协议缓存最多四组筛选条件;加载中共用 Promise,失败移除,成功后才开始 30 秒 TTL。
|
||||
// 全量结果最多缓存四组筛选条件;加载中共用 Promise,失败移除,成功后开始 30 秒 TTL。
|
||||
let s = Date.now();
|
||||
for (let [e, t] of u) t.expires <= s && u.delete(e);
|
||||
let c = u.get(r);
|
||||
|
||||
@@ -41,7 +41,7 @@ function d(e) {
|
||||
e
|
||||
);
|
||||
}
|
||||
// 仅清理区域文案中的“第一区/1区”等展示后缀,不改区域 id。
|
||||
// 清理区域文案中的“第一区/1区”等编号及冗余分隔,不改区域 id。
|
||||
function f(e) {
|
||||
let t = `(?:第\\s*)?(?:[一二三四五六七八九十百零〇两]+|[0-90-9]+)\\s*区`;
|
||||
return e
|
||||
|
||||
@@ -54,7 +54,7 @@ function u(e) {
|
||||
typeof t[e] == `string` && t[e].trim().length > 0 && t[e].length <= 8192,
|
||||
);
|
||||
}
|
||||
/** d 为场景名;无场景时由调用方手动控制加载,组件销毁会取消请求并清空凭证。 */
|
||||
/** d 为场景名;无场景时手动控制,销毁时中止图片请求、清空凭证并作废迟到的接口响应。 */
|
||||
function d(d) {
|
||||
let f = useSiteConfig_t(),
|
||||
p = useApi(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 列表页面共用加载器:分页、同请求去重、身份隔离、缓存首屏与刷新失败保留旧结果。
|
||||
* 列表共用加载器:分页、同请求去重、身份隔离、初次加载回显缓存与刷新失败保留旧结果。
|
||||
* 缓存来自统一 auth 模块;旧查询/旧账号/已卸载组件的响应不能覆盖当前列表。
|
||||
*/
|
||||
import { onMounted } from "vue";
|
||||
|
||||
Reference in new issue
Block a user