feat(api): 添加多路由代理处理实现
- 新增api目录下多个接口路径代理处理文件,支持动态拼接目标URL - 根据环境变量选择不同的后端服务地址(如dev和生产环境) - 统一添加TenantId和Authorization请求头传递租户及身份信息 - 实现请求参数及搜索参数的完整转发 - 引入better-sqlite3及node内建模块支持服务端功能 - 新增专家详情页面,实现文章、成果及预约咨询功能展示 - 页面实现加载骨架屏、标签页切换及空状态提示优化体验
This commit is contained in:
350
.output/server/chunks/build/bind-phone-CjPFbjTp.mjs
Normal file
350
.output/server/chunks/build/bind-phone-CjPFbjTp.mjs
Normal file
@@ -0,0 +1,350 @@
|
||||
import { defineComponent, computed, ref, reactive, resolveComponent, mergeProps, unref, withCtx, createTextVNode, createVNode, toDisplayString, useSSRContext } from 'vue';
|
||||
import { ssrRenderAttrs, ssrRenderComponent, ssrInterpolate } from 'vue/server-renderer';
|
||||
import { message } from 'ant-design-vue';
|
||||
import { CloseCircleOutlined } from '@ant-design/icons-vue';
|
||||
import { r as requestClient } from './request-BIxQh2im.mjs';
|
||||
import { a as _export_sfc, e as useRoute, d as useRouter, S as SERVER_API_URL } from './server.mjs';
|
||||
import { s as sendSmsCaptcha, a as setInterval } from './index-CEJdy8RB.mjs';
|
||||
import '../nitro/nitro.mjs';
|
||||
import 'node:http';
|
||||
import 'node:https';
|
||||
import 'node:events';
|
||||
import 'node:buffer';
|
||||
import 'node:fs';
|
||||
import 'node:path';
|
||||
import 'node:crypto';
|
||||
import 'node:url';
|
||||
import 'better-sqlite3';
|
||||
import 'vue-router';
|
||||
import '@babel/runtime/helpers/esm/extends';
|
||||
import 'stylis';
|
||||
import 'dayjs';
|
||||
import '../routes/renderer.mjs';
|
||||
import 'vue-bundle-renderer/runtime';
|
||||
import 'unhead/server';
|
||||
import 'devalue';
|
||||
import 'unhead/plugins';
|
||||
import 'unhead/utils';
|
||||
import './token-util-C_wOpB5F.mjs';
|
||||
|
||||
function isSuccess(code) {
|
||||
return code === 0 || code === 200;
|
||||
}
|
||||
async function bindQrLoginPhone(requestData) {
|
||||
const res = await requestClient.post(
|
||||
SERVER_API_URL + "/qr-login/bind-phone",
|
||||
requestData
|
||||
);
|
||||
if (isSuccess(res.data.code) && res.data.data) {
|
||||
return res.data.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.data.message || "绑定手机号失败"));
|
||||
}
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
__name: "bind-phone",
|
||||
__ssrInlineRender: true,
|
||||
setup(__props) {
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const token = computed(() => String(route.query.token || ""));
|
||||
const formRef = ref();
|
||||
const submitting = ref(false);
|
||||
const sendingSms = ref(false);
|
||||
const countdown = ref(0);
|
||||
const pageState = ref("loading");
|
||||
const pageMessage = ref("");
|
||||
let countdownTimer = null;
|
||||
const form = reactive({
|
||||
phone: "",
|
||||
smsCode: ""
|
||||
});
|
||||
const phoneReg = /^1[3-9]\d{9}$/;
|
||||
const rules = reactive({
|
||||
phone: [
|
||||
{ required: true, message: "请输入手机号", type: "string" },
|
||||
{ pattern: phoneReg, message: "手机号格式不正确", trigger: "blur" }
|
||||
],
|
||||
smsCode: [{ required: true, message: "请输入短信验证码", type: "string" }]
|
||||
});
|
||||
function stopCountdown() {
|
||||
if (countdownTimer) {
|
||||
clearInterval(countdownTimer);
|
||||
countdownTimer = null;
|
||||
}
|
||||
countdown.value = 0;
|
||||
}
|
||||
function persistUserInfo(result) {
|
||||
result.accessToken || result.access_token;
|
||||
}
|
||||
async function applyLoginResult(result, successText = "登录成功") {
|
||||
persistUserInfo(result);
|
||||
message.success(successText);
|
||||
await router.replace("/");
|
||||
}
|
||||
async function sendSmsCode() {
|
||||
if (!phoneReg.test(form.phone)) {
|
||||
return message.warning("请先输入正确的手机号");
|
||||
}
|
||||
sendingSms.value = true;
|
||||
try {
|
||||
await sendSmsCaptcha({ phone: form.phone });
|
||||
message.success("验证码已发送");
|
||||
stopCountdown();
|
||||
countdown.value = 60;
|
||||
countdownTimer = setInterval(() => {
|
||||
countdown.value -= 1;
|
||||
if (countdown.value <= 0) {
|
||||
stopCountdown();
|
||||
}
|
||||
}, 1e3);
|
||||
} catch (error) {
|
||||
message.error(error instanceof Error ? error.message : "发送验证码失败");
|
||||
} finally {
|
||||
sendingSms.value = false;
|
||||
}
|
||||
}
|
||||
async function submit() {
|
||||
if (!formRef.value || !token.value) return;
|
||||
submitting.value = true;
|
||||
try {
|
||||
await formRef.value.validate();
|
||||
const result = await bindQrLoginPhone({
|
||||
token: token.value,
|
||||
phone: form.phone,
|
||||
code: form.smsCode
|
||||
});
|
||||
await applyLoginResult(result, "手机号绑定成功,已完成登录");
|
||||
} catch (error) {
|
||||
message.error(error instanceof Error ? error.message : "绑定手机号失败");
|
||||
} finally {
|
||||
submitting.value = false;
|
||||
}
|
||||
}
|
||||
function goToLogin() {
|
||||
router.replace("/login");
|
||||
}
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
const _component_a_spin = resolveComponent("a-spin");
|
||||
const _component_a_button = resolveComponent("a-button");
|
||||
const _component_a_alert = resolveComponent("a-alert");
|
||||
const _component_a_form = resolveComponent("a-form");
|
||||
const _component_a_form_item = resolveComponent("a-form-item");
|
||||
const _component_a_input = resolveComponent("a-input");
|
||||
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bind-phone-page" }, _attrs))} data-v-aeff4e43><div class="bind-card" data-v-aeff4e43><div class="bind-header" data-v-aeff4e43><h1 data-v-aeff4e43>绑定手机号</h1><p data-v-aeff4e43>首次通过公众号登录,请先完成手机号绑定</p></div>`);
|
||||
if (pageState.value === "loading") {
|
||||
_push(`<div class="bind-state" data-v-aeff4e43>`);
|
||||
_push(ssrRenderComponent(_component_a_spin, { size: "large" }, null, _parent));
|
||||
_push(`<span data-v-aeff4e43>正在校验登录状态...</span></div>`);
|
||||
} else if (pageState.value === "error") {
|
||||
_push(`<div class="bind-state error" data-v-aeff4e43>`);
|
||||
_push(ssrRenderComponent(unref(CloseCircleOutlined), { class: "state-icon" }, null, _parent));
|
||||
_push(`<p data-v-aeff4e43>${ssrInterpolate(pageMessage.value)}</p>`);
|
||||
_push(ssrRenderComponent(_component_a_button, {
|
||||
type: "primary",
|
||||
onClick: goToLogin
|
||||
}, {
|
||||
default: withCtx((_, _push2, _parent2, _scopeId) => {
|
||||
if (_push2) {
|
||||
_push2(`返回登录`);
|
||||
} else {
|
||||
return [
|
||||
createTextVNode("返回登录")
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent));
|
||||
_push(`</div>`);
|
||||
} else {
|
||||
_push(`<div class="bind-form-wrap" data-v-aeff4e43>`);
|
||||
_push(ssrRenderComponent(_component_a_alert, {
|
||||
type: "warning",
|
||||
"show-icon": "",
|
||||
message: pageMessage.value || "绑定成功后将自动完成当前扫码登录",
|
||||
class: "bind-alert"
|
||||
}, null, _parent));
|
||||
_push(ssrRenderComponent(_component_a_form, {
|
||||
ref_key: "formRef",
|
||||
ref: formRef,
|
||||
model: form,
|
||||
rules,
|
||||
layout: "vertical"
|
||||
}, {
|
||||
default: withCtx((_, _push2, _parent2, _scopeId) => {
|
||||
if (_push2) {
|
||||
_push2(ssrRenderComponent(_component_a_form_item, {
|
||||
label: "手机号",
|
||||
name: "phone"
|
||||
}, {
|
||||
default: withCtx((_2, _push3, _parent3, _scopeId2) => {
|
||||
if (_push3) {
|
||||
_push3(ssrRenderComponent(_component_a_input, {
|
||||
value: form.phone,
|
||||
"onUpdate:value": ($event) => form.phone = $event,
|
||||
size: "large",
|
||||
placeholder: "请输入手机号"
|
||||
}, null, _parent3, _scopeId2));
|
||||
} else {
|
||||
return [
|
||||
createVNode(_component_a_input, {
|
||||
value: form.phone,
|
||||
"onUpdate:value": ($event) => form.phone = $event,
|
||||
size: "large",
|
||||
placeholder: "请输入手机号"
|
||||
}, null, 8, ["value", "onUpdate:value"])
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent2, _scopeId));
|
||||
_push2(ssrRenderComponent(_component_a_form_item, {
|
||||
label: "短信验证码",
|
||||
name: "smsCode"
|
||||
}, {
|
||||
default: withCtx((_2, _push3, _parent3, _scopeId2) => {
|
||||
if (_push3) {
|
||||
_push3(`<div class="sms-row" data-v-aeff4e43${_scopeId2}>`);
|
||||
_push3(ssrRenderComponent(_component_a_input, {
|
||||
value: form.smsCode,
|
||||
"onUpdate:value": ($event) => form.smsCode = $event,
|
||||
size: "large",
|
||||
placeholder: "请输入短信验证码"
|
||||
}, null, _parent3, _scopeId2));
|
||||
_push3(ssrRenderComponent(_component_a_button, {
|
||||
disabled: countdown.value > 0,
|
||||
loading: sendingSms.value,
|
||||
size: "large",
|
||||
onClick: sendSmsCode
|
||||
}, {
|
||||
default: withCtx((_3, _push4, _parent4, _scopeId3) => {
|
||||
if (_push4) {
|
||||
_push4(`${ssrInterpolate(countdown.value > 0 ? `${countdown.value}s 后重试` : "发送验证码")}`);
|
||||
} else {
|
||||
return [
|
||||
createTextVNode(toDisplayString(countdown.value > 0 ? `${countdown.value}s 后重试` : "发送验证码"), 1)
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent3, _scopeId2));
|
||||
_push3(`</div>`);
|
||||
} else {
|
||||
return [
|
||||
createVNode("div", { class: "sms-row" }, [
|
||||
createVNode(_component_a_input, {
|
||||
value: form.smsCode,
|
||||
"onUpdate:value": ($event) => form.smsCode = $event,
|
||||
size: "large",
|
||||
placeholder: "请输入短信验证码"
|
||||
}, null, 8, ["value", "onUpdate:value"]),
|
||||
createVNode(_component_a_button, {
|
||||
disabled: countdown.value > 0,
|
||||
loading: sendingSms.value,
|
||||
size: "large",
|
||||
onClick: sendSmsCode
|
||||
}, {
|
||||
default: withCtx(() => [
|
||||
createTextVNode(toDisplayString(countdown.value > 0 ? `${countdown.value}s 后重试` : "发送验证码"), 1)
|
||||
]),
|
||||
_: 1
|
||||
}, 8, ["disabled", "loading"])
|
||||
])
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent2, _scopeId));
|
||||
_push2(ssrRenderComponent(_component_a_button, {
|
||||
type: "primary",
|
||||
block: "",
|
||||
size: "large",
|
||||
loading: submitting.value,
|
||||
onClick: submit
|
||||
}, {
|
||||
default: withCtx((_2, _push3, _parent3, _scopeId2) => {
|
||||
if (_push3) {
|
||||
_push3(` 绑定手机号并登录 `);
|
||||
} else {
|
||||
return [
|
||||
createTextVNode(" 绑定手机号并登录 ")
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent2, _scopeId));
|
||||
} else {
|
||||
return [
|
||||
createVNode(_component_a_form_item, {
|
||||
label: "手机号",
|
||||
name: "phone"
|
||||
}, {
|
||||
default: withCtx(() => [
|
||||
createVNode(_component_a_input, {
|
||||
value: form.phone,
|
||||
"onUpdate:value": ($event) => form.phone = $event,
|
||||
size: "large",
|
||||
placeholder: "请输入手机号"
|
||||
}, null, 8, ["value", "onUpdate:value"])
|
||||
]),
|
||||
_: 1
|
||||
}),
|
||||
createVNode(_component_a_form_item, {
|
||||
label: "短信验证码",
|
||||
name: "smsCode"
|
||||
}, {
|
||||
default: withCtx(() => [
|
||||
createVNode("div", { class: "sms-row" }, [
|
||||
createVNode(_component_a_input, {
|
||||
value: form.smsCode,
|
||||
"onUpdate:value": ($event) => form.smsCode = $event,
|
||||
size: "large",
|
||||
placeholder: "请输入短信验证码"
|
||||
}, null, 8, ["value", "onUpdate:value"]),
|
||||
createVNode(_component_a_button, {
|
||||
disabled: countdown.value > 0,
|
||||
loading: sendingSms.value,
|
||||
size: "large",
|
||||
onClick: sendSmsCode
|
||||
}, {
|
||||
default: withCtx(() => [
|
||||
createTextVNode(toDisplayString(countdown.value > 0 ? `${countdown.value}s 后重试` : "发送验证码"), 1)
|
||||
]),
|
||||
_: 1
|
||||
}, 8, ["disabled", "loading"])
|
||||
])
|
||||
]),
|
||||
_: 1
|
||||
}),
|
||||
createVNode(_component_a_button, {
|
||||
type: "primary",
|
||||
block: "",
|
||||
size: "large",
|
||||
loading: submitting.value,
|
||||
onClick: submit
|
||||
}, {
|
||||
default: withCtx(() => [
|
||||
createTextVNode(" 绑定手机号并登录 ")
|
||||
]),
|
||||
_: 1
|
||||
}, 8, ["loading"])
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent));
|
||||
_push(`</div>`);
|
||||
}
|
||||
_push(`</div></div>`);
|
||||
};
|
||||
}
|
||||
});
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/bind-phone.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
const bindPhone = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-aeff4e43"]]);
|
||||
|
||||
export { bindPhone as default };
|
||||
//# sourceMappingURL=bind-phone-CjPFbjTp.mjs.map
|
||||
Reference in New Issue
Block a user