docs: annotate account commerce finance and content pages

This commit is contained in:
cieanyau committed 2026-11-06 00:29:13 +08:00
1 parent 60827b8bfb
commit 2be21c1c62
24 files changed
+223

No files matched your search

+12
View File
@@ -1,4 +1,7 @@
<script>
/**
* API 密钥管理:列表分页、创建、IP 白名单编辑及删除。私钥仅在创建响应中保留,关闭弹窗或离开页面即清空,不能视为可再次查询的资料。
*/
import "~/assets/styles/api-keys.Bq3Csr53.css";
import { toDisplayString } from "vue";
import { onMounted } from "vue";
@@ -33,6 +36,7 @@ import paginator from "primevue/paginator";
import checkbox from "primevue/checkbox";
import column from "primevue/column";
import textarea from "primevue/textarea";
// 集中管理列表权限、写操作忙碌态和仅本次可见的私钥;请求代次与存活标记防止旧响应更新已离开的页面。
function D() {
let e = useApi(),
t = ref([]),
@@ -60,6 +64,7 @@ function D() {
onBeforeUnmount(() => {
((v = !1), y++, b());
});
// 刷新当前页并读取服务端 create_api 权限;响应结构无效时不开放创建入口。
async function x() {
if (!v) return;
let n = ++y;
@@ -86,6 +91,7 @@ function D() {
v && n === y && (o.value = !1);
}
}
// 只在权限已加载且允许创建时提交。创建响应不完整时提示先刷新核实,避免误以为失败而重复生成密钥。
async function C() {
if (!(!v || s.value || m.value)) {
if (((d.value = ``), (f.value = ``), !l.value || o.value)) {
@@ -123,6 +129,7 @@ function D() {
}
}
}
// 打开白名单编辑器时复制行数据,未保存的输入不直接修改列表。
function w(e) {
s.value ||
((d.value = ``),
@@ -131,6 +138,7 @@ function D() {
(g.enabled = Number(e.status) === 1),
(g.ip = e.ip || ``));
}
// 开启白名单必须提供 IP;保存成功后关闭编辑器并重新读取服务端数据。
async function T() {
if (!v || s.value || !h.value) return;
if (((d.value = ``), (f.value = ``), g.enabled && !g.ip.trim())) {
@@ -155,6 +163,7 @@ function D() {
v && (s.value = !1);
}
}
// 删除成功后,若当前页只剩这一条则回退一页,再刷新列表。
async function E() {
if (v && !s.value && _.value?.id) {
((d.value = ``), (f.value = ``), (s.value = !0));
@@ -271,6 +280,7 @@ var O = {
!e && !N.value && (U.value = null);
},
});
// 复制创建时返回的私钥;剪贴板不可用时保留手动复制提示,不把私钥写入持久存储。
async function he() {
if (z.value) {
J.value = ``;
@@ -282,9 +292,11 @@ var O = {
}
}
}
// 关闭私钥展示同时清空密钥与复制反馈,避免之后再次暴露。
function Z() {
(B(), (q.value = !1), (J.value = ``));
}
// 分页器为零基页码,接口页码从 1 开始。
function ge(e) {
((S.value = e.page + 1), W());
}
+5
View File
@@ -1,4 +1,7 @@
<script>
/**
* 第三方账号关联管理:从账户资料整理 OAuth 绑定状态,通过公共 OAuth 流程发起关联,并确认后解除绑定。
*/
import "~/assets/styles/WechatConnection.DI5ko1xy.css";
import { toDisplayString } from "vue";
import { renderList } from "vue";
@@ -77,6 +80,7 @@ var D = {
onBeforeUnmount(() => {
J = !1;
});
// 读取 /account 的 OAuth 关联列表;组件卸载后的响应不再更新界面。
async function Y() {
if (!R.value) {
((R.value = !0), (z.value = ``));
@@ -91,6 +95,7 @@ var D = {
}
}
}
// 仅对已关联的提供方执行解绑;请求完成后重新加载列表,以服务端结果为准。
async function X() {
if (U.value?.linked && !H.value && !W.value && J) {
((H.value = !0), (z.value = ``), (B.value = ``));
+25
View File
@@ -1,4 +1,7 @@
<script>
/**
* 账户设置聚合页:资料、登录密码、操作密码、手机、邮箱和流量预警分别维护表单与提交状态;敏感修改可由安全验证弹窗续接原请求。
*/
import "~/assets/styles/UploadField.BbTCTv6C.css";
import "~/assets/styles/PageSteps.B5K7G9zF.css";
import "~/assets/styles/PaymentDialog.BNFKQF1U.css";
@@ -324,6 +327,7 @@ var Ce = {
label: `流量预警`,
},
];
// 为账户设置标签提供左右方向键及 Home/End 导航,并同步实际焦点。
function Xt(e, t) {
let n = t;
if (e.key === `ArrowRight`) n = (t + 1) % E.length;
@@ -336,6 +340,7 @@ var Ce = {
document.getElementById(`account-tab-${T.value}`)?.focus());
}
let Zt = ref([]);
// 加载账户并回填资料表单,同时决定手机、邮箱是否需要先验证旧联系方式。
async function Qt() {
Gt.value = !0;
try {
@@ -354,6 +359,7 @@ var Ce = {
}
}
let $t = ref(!1);
// 国家选项按需加载;失败时保留空选项,后续仍可重新尝试。
async function en() {
if (!$t.value)
try {
@@ -380,9 +386,11 @@ var Ce = {
function N(e, t) {
D.value = e instanceof Error ? e.message : t;
}
// 暂存安全挑战及原操作闭包,验证成功后以原表单快照继续提交。
function rn(e, t) {
((tn.value = e), (A.value = t), (k.value = !0));
}
// 把安全验证结果交给待续接操作;再次出现挑战时更新弹窗,不把尚未验证的结果当成功。
async function an(e) {
if (A.value && !j.value) {
((j.value = !0), (D.value = ``));
@@ -405,6 +413,7 @@ var Ce = {
country_id: null,
}),
on = ref(!1);
// 保存可编辑资料,同时保留当前账户已有的 language、notes 字段,避免更新接口覆盖它们。
async function sn() {
(M(), (on.value = !0));
try {
@@ -424,6 +433,7 @@ var Ce = {
on.value = !1;
}
}
// 取消编辑时从账户快照还原表单,不额外写入接口。
function cn() {
(M(),
S.value &&
@@ -483,6 +493,7 @@ var Ce = {
onBeforeUnmount(() => {
((U = !0), clearInterval(gn), (A.value = null));
}));
// 向已绑定手机或邮箱发送 verify 验证码;成功后启动 60 秒倒计时,离页时清理计时器。
async function vn() {
if (
!(
@@ -518,6 +529,7 @@ var Ce = {
}
}
}
// 根据旧密码或验证码验证方式选择不同接口;密码一致性通过后才提交,安全挑战保留同一份请求数据。
async function yn() {
if (I.value || j.value || k.value || w(`password`)) return;
if (
@@ -602,6 +614,7 @@ var Ce = {
G = ref({}),
Sn = ref(!1),
Cn = ref(``);
// 分别加载云服务器与独立服务器的流量预警;单个模块失败只记录该模块错误。
async function wn() {
((Sn.value = !0), (G.value = {}));
try {
@@ -643,12 +656,14 @@ var Ce = {
Sn.value = !1;
}
}
// 开启预警且未选阈值时提供初始比例;关闭状态的实际提交比例在保存时归零。
function Tn(e, t) {
let n = +!!t,
r = W.value[e];
((r.warning_switch = n),
n === 1 && !r.leave_percent && (r.leave_percent = xn[1]));
}
// 按模块保存预警开关和剩余流量比例,避免另一模块的草稿被一并提交。
async function En(e) {
let t = W.value[e];
if (t) {
@@ -673,6 +688,7 @@ var Ce = {
re_operate_password: ``,
}),
Dn = ref(!1);
// 操作密码独立于登录密码;支持安全挑战续接,成功后清空密码输入。
async function On() {
if (Dn.value || j.value || k.value) return;
if ((M(), !K.operate_password)) {
@@ -730,6 +746,7 @@ var Ce = {
update: useCaptcha_t(`update`),
},
};
// 统一联系方式 verify/update 场景的验证码请求,并由各自验证码实例处理挑战失效。
async function jn(e, t, n = {}) {
let r = An[e][t],
ee = r.validationError();
@@ -746,6 +763,7 @@ var Ce = {
throw (await r.handleError(e), e);
}
}
// 向当前绑定手机号发送旧号码验证短信。
async function Mn() {
if (!(Y.value || w(`phone`))) {
(M(), (Y.value = !0));
@@ -759,6 +777,7 @@ var Ce = {
}
}
}
// 旧手机号验证通过后才进入新号码绑定步骤。
async function Nn() {
(M(), (Y.value = !0));
try {
@@ -773,6 +792,7 @@ var Ce = {
Y.value = !1;
}
}
// 向草稿中的新手机号发送 update 场景验证码。
async function Pn() {
if (!(Y.value || w(`phone`))) {
(M(), (Y.value = !0));
@@ -790,6 +810,7 @@ var Ce = {
}
}
}
// 完成新号码绑定后重载账户,清空新旧验证码并复位步骤。
async function Fn() {
(M(), (Y.value = !0));
try {
@@ -821,6 +842,7 @@ var Ce = {
t = e === `phone` ? J.value : Z.value;
return An[e][t === 1 ? `verify` : `update`];
});
// 向当前绑定邮箱发送旧邮箱验证邮件。
async function Ln() {
if (!(Q.value || w(`email`))) {
(M(), (Q.value = !0));
@@ -834,6 +856,7 @@ var Ce = {
}
}
}
// 旧邮箱验证通过后才进入新邮箱绑定步骤。
async function Rn() {
(M(), (Q.value = !0));
try {
@@ -848,6 +871,7 @@ var Ce = {
Q.value = !1;
}
}
// 向草稿中的新邮箱发送 update 场景验证码。
async function zn() {
if (!(Q.value || w(`email`))) {
(M(), (Q.value = !0));
@@ -864,6 +888,7 @@ var Ce = {
}
}
}
// 提交新邮箱及验证码;成功后重载账户资料并清空步骤输入。
async function Bn() {
(M(), (Q.value = !0));
try {
+3
View File
@@ -1,4 +1,7 @@
<script>
/**
* 企业实名认证路由适配层:复用统一实名认证页,仅把 initial-type 设为 company;认证状态、接口与上传流程均由统一页负责。
*/
import "~/assets/styles/UploadField.BbTCTv6C.css";
import "~/assets/styles/PageSteps.B5K7G9zF.css";
import "~/assets/styles/PaymentDialog.BNFKQF1U.css";
+25
View File
@@ -1,4 +1,7 @@
<script>
/**
* 实名认证流程:个人/企业资料 → 选择渠道及动态字段 → 必要时支付认证费 → 二维码核验与状态轮询。序号将异步结果绑定到当前资料、渠道和核验会话。
*/
import "~/assets/styles/UploadField.BbTCTv6C.css";
import "~/assets/styles/PageSteps.B5K7G9zF.css";
import "~/assets/styles/PaymentDialog.BNFKQF1U.css";
@@ -46,6 +49,7 @@ import tablist from "primevue/tablist";
import tab from "primevue/tab";
var b = `#contentBox img[src^="data:image/"], #qrcode img, #qrCode img, img#qrcode, img#qrCode, .qrcode img, .qr-code img`,
x = `img[src^="data:image/png;base64,"], img[src^="data:image/jpeg;base64,"]`;
// 从认证服务返回的 HTML 中定位二维码,保留其动态更新逻辑并隐藏其余内容;无法唯一定位时拒绝展示。
function S(e) {
let t = new DOMParser().parseFromString(e, `text/html`),
n =
@@ -454,6 +458,7 @@ var xe = {
flush: `sync`,
},
);
// 只收集已上传的图片标识,空字段不随申请发送。
function At() {
let e = {};
for (let [t, n] of Object.entries(G)) n && (e[t] = n);
@@ -466,9 +471,11 @@ var xe = {
Q = null,
$ = 0,
Mt = 0;
// 结束当前核验轮询并提升会话序号,使已在途回调失效。
function Nt() {
($++, Q !== null && (clearTimeout(Q), (Q = null)), (jt.value = !1));
}
// 读取实名开关及个人/企业状态;仅最新请求可以写入当前页面。
async function Pt() {
let e = ++M;
((xt.value = !0), (z.value = ``));
@@ -483,11 +490,13 @@ var xe = {
!N && e === M && (xt.value = !1);
}
}
// 切换渠道或关闭弹窗时清理动态字段与加载标识,同时使旧字段请求失效。
function Ft() {
(j++, (_t.value = ``), (A.value = ``), (k.value = !1));
for (let e of Object.keys(O)) delete O[e];
gt.value = [];
}
// 兼容服务端布尔、数字和字符串形式的必填标识。
function It(e) {
return (
e.required === !0 ||
@@ -496,6 +505,7 @@ var xe = {
e.required === `true`
);
}
// 将数组、对象、JSON 字符串或逗号列表整理为选择项,供认证渠道动态表单使用。
function Lt(e) {
if (Array.isArray(e))
return e.map((e) => ({
@@ -521,6 +531,7 @@ var xe = {
}
return [];
}
// 加载当前认证类型与渠道的动态字段;请求结束时同时核对渠道、类型、弹窗状态和代次。
async function Rt(e) {
Ft();
let t = j,
@@ -553,6 +564,7 @@ var xe = {
i() && (k.value = !1);
}
}
// 验证个人资料及要求上传的证件后,暂存申请并进入渠道选择。
async function zt() {
if (!(W.value || C.value || Y.value || P.value || !Dt.value)) {
if (((z.value = ``), K.value))
@@ -569,6 +581,7 @@ var xe = {
});
}
}
// 企业申请额外校验企业实名开关、个人认证前置条件、营业执照和必要的委托书。
async function Bt() {
if (!(
W.value ||
@@ -597,6 +610,7 @@ var xe = {
});
}
}
// 保存待提交的资料快照;渠道选择不直接修改原始表单。
async function Vt(e, t) {
((F.value = null),
(D.value = {
@@ -607,6 +621,7 @@ var xe = {
(C.value = !0),
await Ht());
}
// 加载可用认证插件,使用独立代次隔离弹窗重开或重试。
async function Ht() {
if (!C.value || W.value) return;
let e = ++I;
@@ -625,6 +640,7 @@ var xe = {
e === I && (w.value = !1);
}
}
// 非提交期间允许关闭渠道弹窗,并使其异步加载结果失效。
function Ut() {
W.value ||
(I++,
@@ -635,6 +651,7 @@ var xe = {
Ft(),
(D.value = null));
}
// 确认动态字段与当前渠道一致后检查渠道费用;需要付费时先保存申请快照并打开支付,不提前提交认证。
async function Wt() {
if (!C.value || w.value || W.value || !D.value) return;
let e = L.value.find((e) => e.name === E.value);
@@ -720,6 +737,7 @@ var xe = {
r === I && (W.value = !1);
}
}
// 已通过个人认证的企业升级走 convert,其余申请走 person/company;渠道字段随同原资料提交。
async function Gt(e, t, n, r) {
let i =
e === `company` && Number(R.value?.person?.status) === 1
@@ -731,6 +749,7 @@ var xe = {
plugin_name: n,
});
}
// 支付回调后再次查询渠道订单,确认同一订单已 Paid 才续交认证,不能仅凭前端支付事件认定到账。
async function Kt() {
let e = F.value;
if (!e || W.value || N) return;
@@ -764,9 +783,11 @@ var xe = {
!N && t === I && (W.value = !1);
}
}
// 重新打开待支付认证订单,不重复生成申请快照。
function qt() {
!W.value && F.value && (P.value = !0);
}
// 开启新的二维码核验会话,先获取二维码,再为当前认证类型启动轮询。
async function Jt(e = V.value === 1 ? `company` : `person`) {
Nt();
let t = $;
@@ -777,6 +798,7 @@ var xe = {
await Xt(t),
t === $ && Y.value && Zt(t, e));
}
// 认证资料失效或变更时终止旧核验并刷新资料,要求用户重新提交。
async function Yt(e) {
if (![`10000`, `10001`].includes(String(e))) return !1;
Qt();
@@ -792,6 +814,7 @@ var xe = {
!0
);
}
// 按当前核验会话加载二维码,并设置刷新时间门槛;过期会话的响应不再显示。
async function Xt(e) {
if (e === $ && Y.value) {
((Z.value = !0), (Mt = Date.now() + (X.value ? 3e4 : 1e4)));
@@ -819,6 +842,7 @@ var xe = {
}
}
}
// 每两秒查询核验状态;第三方完成后仍复查本平台认证资料,区别认证成功与进入审核,关闭后停止调度。
function Zt(e, t) {
jt.value = !0;
let n = () => e === $ && Y.value;
@@ -874,6 +898,7 @@ var xe = {
}
Q = setTimeout(r, 2e3);
}
// 关闭二维码核验并清空 HTML,同时取消下一次状态查询。
function Qt() {
((Y.value = !1), Nt(), (Z.value = !1), (X.value = ``));
}
+3
View File
@@ -1,4 +1,7 @@
<script>
/**
* 个人实名认证路由适配层:复用统一实名认证页,以 person 作为初始认证类型,不单独维护一套提交逻辑。
*/
import "~/assets/styles/UploadField.BbTCTv6C.css";
import "~/assets/styles/PageSteps.B5K7G9zF.css";
import "~/assets/styles/PaymentDialog.BNFKQF1U.css";