feat(preview): 登录新增校验 start 功能
This commit is contained in:
parent
1dc974baf1
commit
7609658921
@ -2,3 +2,7 @@ VITE_BASE_URL=/
|
|||||||
|
|
||||||
# backend service base url, prod environment
|
# backend service base url, prod environment
|
||||||
VITE_SERVICE_BASE_URL=/snail-job
|
VITE_SERVICE_BASE_URL=/snail-job
|
||||||
|
|
||||||
|
VITE_OTHER_SERVICE_BASE_URL= `{
|
||||||
|
"api": "/api"
|
||||||
|
}`
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
VITE_BASE_URL=/
|
VITE_BASE_URL=/
|
||||||
|
|
||||||
# backend service base url, test environment
|
# backend service base url, test environment
|
||||||
VITE_SERVICE_BASE_URL=http://preview.easyretry.com/snail-job
|
VITE_SERVICE_BASE_URL=https://preview.snailjob.opensnail.com/snail-job
|
||||||
|
|
||||||
|
VITE_OTHER_SERVICE_BASE_URL= `{
|
||||||
|
"api": "http://localhost:3000/api"
|
||||||
|
}`
|
||||||
|
@ -69,5 +69,5 @@ function createProxyPattern(key?: App.Service.OtherBaseURLKey) {
|
|||||||
return '/snail-job';
|
return '/snail-job';
|
||||||
}
|
}
|
||||||
|
|
||||||
return `/proxy-${key}`;
|
return `/${key}`;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { reactive, ref } from 'vue';
|
import { onMounted, onUnmounted, reactive, ref } from 'vue';
|
||||||
import Vcode from 'vue3-puzzle-vcode';
|
import Vcode from 'vue3-puzzle-vcode';
|
||||||
|
import { useRoute } from 'vue-router';
|
||||||
import { md5 } from '@/utils/common';
|
import { md5 } from '@/utils/common';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||||
@ -55,6 +56,102 @@ const onClose = () => {
|
|||||||
const onSuccess = () => {
|
const onSuccess = () => {
|
||||||
handleSubmit();
|
handleSubmit();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
const starred = ref<boolean>(false);
|
||||||
|
|
||||||
|
async function userStarred() {
|
||||||
|
const accessToken = localStorage.getItem('gitee_access_token');
|
||||||
|
if (!accessToken) {
|
||||||
|
authorize();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const response = await fetch(`https://gitee.com/api/v5/user/starred/aizuda/snail-job?access_token=${accessToken}`);
|
||||||
|
|
||||||
|
if (response.status === 401) {
|
||||||
|
refreshTokenFn();
|
||||||
|
}
|
||||||
|
|
||||||
|
starred.value = response.status === 204;
|
||||||
|
}
|
||||||
|
|
||||||
|
function authorize() {
|
||||||
|
const clientId = 'aae2edfddf290269fe0a756bc1c1ec1614e41dfabdb71c19322293e2b5179377';
|
||||||
|
const redirectUri = 'https://preview.snailjob.opensnail.com/login';
|
||||||
|
// const redirectUri = 'http://localhost:9527/login';
|
||||||
|
location.href = `https://gitee.com/oauth/authorize?client_id=${clientId}&redirect_uri=${redirectUri}&response_type=code&scope=user_info`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function refreshTokenFn() {
|
||||||
|
const refreshToken = localStorage.getItem('gitee_refresh_token');
|
||||||
|
if (!refreshToken) {
|
||||||
|
authorize();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const response = await fetch('https://gitee.com/oauth/token', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: new Headers({
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}),
|
||||||
|
body: JSON.stringify({
|
||||||
|
grant_type: 'refresh_token',
|
||||||
|
refresh_token: refreshToken
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
const res = await response.json();
|
||||||
|
|
||||||
|
localStorage.setItem('gitee_access_token', res.data.access_token);
|
||||||
|
localStorage.setItem('gitee_refresh_token', res.data.refresh_token);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function oauth2() {
|
||||||
|
const code = route.query.code;
|
||||||
|
if (!code) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const response = await fetch('/api/oauth2/login', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: new Headers({
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}),
|
||||||
|
body: JSON.stringify({ code })
|
||||||
|
});
|
||||||
|
|
||||||
|
const res = await response.json();
|
||||||
|
|
||||||
|
if (res.code !== 200) {
|
||||||
|
authorize();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const accessToken = res.data.access_token;
|
||||||
|
const refreshToken = res.data.refresh_token;
|
||||||
|
localStorage.setItem('gitee_access_token', accessToken);
|
||||||
|
localStorage.setItem('gitee_refresh_token', refreshToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleVisibilitychange() {
|
||||||
|
const state = document.visibilityState;
|
||||||
|
if (state === 'visible') {
|
||||||
|
userStarred();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
document.addEventListener('visibilitychange', handleVisibilitychange);
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
document.removeEventListener('visibilitychange', handleVisibilitychange);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function init() {
|
||||||
|
await oauth2();
|
||||||
|
await userStarred();
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -71,9 +168,25 @@ const onSuccess = () => {
|
|||||||
/>
|
/>
|
||||||
</NFormItem>
|
</NFormItem>
|
||||||
<NSpace vertical :size="24">
|
<NSpace vertical :size="24">
|
||||||
<NPopover :show="codeShow" row style="padding: 0">
|
<div v-if="!starred" class="flex-col-center justify-between">
|
||||||
|
<div>
|
||||||
|
💖 如果您喜欢 Snail Job,请给它一个
|
||||||
|
<NA href="https://gitee.com/aizuda/snail-job" target="_blank" rel="noopener noreferrer"> Star </NA>
|
||||||
|
,
|
||||||
|
</div>
|
||||||
|
<div>您的支持将是我们前行的动力。 👨💻👨💻👨💻</div>
|
||||||
|
</div>
|
||||||
|
<NPopover :show="codeShow" row>
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<NButton type="primary" size="large" round block :loading="authStore.loginLoading" @click="validateCode">
|
<NButton
|
||||||
|
:disabled="!starred"
|
||||||
|
type="primary"
|
||||||
|
size="large"
|
||||||
|
round
|
||||||
|
block
|
||||||
|
:loading="authStore.loginLoading"
|
||||||
|
@click="validateCode"
|
||||||
|
>
|
||||||
{{ $t('page.login.common.login') }}
|
{{ $t('page.login.common.login') }}
|
||||||
</NButton>
|
</NButton>
|
||||||
</template>
|
</template>
|
||||||
@ -92,4 +205,8 @@ const onSuccess = () => {
|
|||||||
</NForm>
|
</NForm>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped>
|
||||||
|
:deep(.n-popover) {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
Loading…
Reference in New Issue
Block a user