发布前校验是否实名认证
This commit is contained in:
@@ -38,6 +38,7 @@ apiClient.interceptors.response.use(
|
||||
localStorage.removeItem('access_token')
|
||||
localStorage.removeItem('refresh_token')
|
||||
localStorage.removeItem('user_id')
|
||||
localStorage.removeItem('realname_status')
|
||||
|
||||
if (!window.location.pathname.startsWith('/m/login') && !window.location.pathname.startsWith('/m/register')) {
|
||||
const redirect = encodeURIComponent(currentPath)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { createRouter, createWebHistory } from "vue-router";
|
||||
|
||||
import { useSessionStore } from "@/stores/session";
|
||||
import { isMobileHost, toMobilePath } from "./mobileHost";
|
||||
|
||||
const router = createRouter({
|
||||
@@ -65,7 +66,7 @@ const router = createRouter({
|
||||
name: "mobile-seller-listing-create",
|
||||
component: () =>
|
||||
import("@/views/mobile/MobileSellerListingCreateView.vue"),
|
||||
meta: { layout: "blank", requiresAuth: true },
|
||||
meta: { layout: "blank", requiresAuth: true, requiresRealname: true },
|
||||
},
|
||||
{
|
||||
path: "/",
|
||||
@@ -212,7 +213,7 @@ const router = createRouter({
|
||||
],
|
||||
});
|
||||
|
||||
router.beforeEach((to) => {
|
||||
router.beforeEach(async (to) => {
|
||||
if (isMobileHost() && to.path !== toMobilePath(to.path)) {
|
||||
return { path: toMobilePath(to.path), query: to.query, hash: to.hash };
|
||||
}
|
||||
@@ -221,6 +222,23 @@ router.beforeEach((to) => {
|
||||
return { path: "/m/login", query: { redirect: to.fullPath } };
|
||||
}
|
||||
|
||||
if (to.meta.requiresRealname) {
|
||||
const session = useSessionStore();
|
||||
if (session.realnameStatus !== "verified") {
|
||||
try {
|
||||
await session.loadMe();
|
||||
} catch {
|
||||
if (!localStorage.getItem("access_token")) {
|
||||
return { path: "/m/login", query: { redirect: to.fullPath } };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (session.realnameStatus !== "verified") {
|
||||
return { path: "/m/realname", query: { redirect: to.fullPath } };
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
to.path === "/admin/login" &&
|
||||
localStorage.getItem("admin_access_token")
|
||||
|
||||
@@ -8,7 +8,7 @@ export const useSessionStore = defineStore('session', {
|
||||
refreshToken: localStorage.getItem('refresh_token') || '',
|
||||
userId: Number(localStorage.getItem('user_id') || 0),
|
||||
phone: '',
|
||||
realnameStatus: 'unknown',
|
||||
realnameStatus: localStorage.getItem('realname_status') || 'unknown',
|
||||
}),
|
||||
actions: {
|
||||
async login(phone: string, code: string) {
|
||||
@@ -30,6 +30,7 @@ export const useSessionStore = defineStore('session', {
|
||||
localStorage.removeItem('access_token')
|
||||
localStorage.removeItem('refresh_token')
|
||||
localStorage.removeItem('user_id')
|
||||
localStorage.removeItem('realname_status')
|
||||
},
|
||||
applySession(user: AuthUser, accessToken: string, refreshToken: string) {
|
||||
this.token = accessToken
|
||||
@@ -45,6 +46,7 @@ export const useSessionStore = defineStore('session', {
|
||||
localStorage.setItem('user_id', String(user.id))
|
||||
this.phone = user.phone
|
||||
this.realnameStatus = user.realname_status
|
||||
localStorage.setItem('realname_status', user.realname_status)
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
@@ -44,7 +44,28 @@ async function handleCreateOrder() {
|
||||
cancelButtonText: "取消",
|
||||
showCancelButton: true,
|
||||
}).then(() => {
|
||||
router.push("/m/login");
|
||||
router.push({ path: "/m/login", query: { redirect: route.fullPath } });
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (session.realnameStatus !== "verified") {
|
||||
try {
|
||||
await session.loadMe();
|
||||
} catch {
|
||||
// 401 会由全局拦截器处理。
|
||||
}
|
||||
}
|
||||
|
||||
if (session.realnameStatus !== "verified") {
|
||||
showDialog({
|
||||
title: "请先实名认证",
|
||||
message: "租号下单前需要完成实名认证。",
|
||||
confirmButtonText: "去认证",
|
||||
cancelButtonText: "取消",
|
||||
showCancelButton: true,
|
||||
}).then(() => {
|
||||
router.push({ path: "/m/realname", query: { redirect: route.fullPath } });
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
import { onMounted, reactive, ref } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import { showToast, showDialog } from "vant";
|
||||
import {
|
||||
getRealnameStatus,
|
||||
@@ -11,6 +11,7 @@ import { useSessionStore } from "@/stores/session";
|
||||
|
||||
const session = useSessionStore();
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
const loading = ref(false);
|
||||
const status = ref<RealnameStatus | null>(null);
|
||||
const form = reactive({
|
||||
@@ -20,10 +21,22 @@ const form = reactive({
|
||||
|
||||
onMounted(loadStatus);
|
||||
|
||||
function redirectAfterVerified() {
|
||||
const redirect =
|
||||
typeof route.query.redirect === "string" ? route.query.redirect : "";
|
||||
if (redirect) {
|
||||
router.replace(redirect);
|
||||
}
|
||||
}
|
||||
|
||||
async function loadStatus() {
|
||||
if (!session.token) return;
|
||||
try {
|
||||
status.value = await getRealnameStatus();
|
||||
if (status.value.status === "verified") {
|
||||
await session.loadMe();
|
||||
redirectAfterVerified();
|
||||
}
|
||||
} catch {
|
||||
status.value = null;
|
||||
}
|
||||
@@ -46,6 +59,8 @@ async function handleSubmit() {
|
||||
title: "认证成功",
|
||||
message: "实名认证已通过",
|
||||
confirmButtonText: "好的",
|
||||
}).then(() => {
|
||||
redirectAfterVerified();
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const msg =
|
||||
|
||||
Reference in New Issue
Block a user